考研C语言第六章

news2024/11/25 23:54:09

6.2指针

在这里插入图片描述
类似寻宝图,先把地址存储到指针变量里面,然后去找这个地址
指针大小
当64bit——8bit
当32bit——4bit
在这里插入图片描述
定义指针一定要和里面的数定义一样类型的

6.3指针的传递使用场景

指针的使用场景:传递和偏移
(不需要的话就别用指针)
传递

#include <stdio.h>
#include <string.h>

void change(j)
{
    j=5;
}

int main() {
    int i=10;
    printf("before i=%d\n",i);
    change(i);//C语言的函数调用是值传递,实参赋值给形参,j=i
    printf("after i=%d\n",i);
    return 0;
}

在这里插入图片描述
i并没有改变,原因是这两个变量的地址根本不是一个,他们类似于在两个平行宇宙,各干各的

#include <stdio.h>
#include <string.h>

void change(int *j)
{
    *j=5;//间接访问  *j等价于变量i
}

int main() {
    int i=10;
    printf("before i=%d\n",i);
    change(&i);//i的地址
    printf("after i=%d\n",i);
    return 0;
}

传入的参数是地址,上面函数要取地址,这两个参数就可以对应

偏移
类似于住楼房,一共14层,指针加减指向不同的楼层里面的住户
在这里插入图片描述
指针+1里面偏移的是类型的bit数,int就是4

#include <stdio.h>
#include <string.h>
//指针的偏移使用场景,也就是对指针进行加减

#define N 5
int main() {
    int a[N]={1,2,3,4,5};
    int *p;
    p=a;//这里不是p=&a的原因是:数组名字里面存储了数组的起始地址
    for(int i=0;i<N;i++)
    {
        printf("%3d",*(p+i));
    }
    return 0;
}

把*(p+1)拆开看
p+1这一句用了上面知识点,加一是加在数据类型上的,在地址上是跳了四个字节,eg:0x61fdf0——0x61fdf4
也就是从这样
在这里插入图片描述
变成了这样
在这里插入图片描述
*(p+1)取地址,此时就是2这个方块的地址
指针与一位数组

#include <stdio.h>
#include <string.h>
//指针与一维数组的传递
//数组名作为实参传递给子函数时,是弱化为指针的
//练习传递与偏移
void change(char *d)
{
    //这三种是利用指针修改数组的数据,一和三本质上是一样的
    *d='H';
    d[1]='E';
    *(d+2)='L';
}
int main() {
    char c[10]="hello";
    change(c);
    puts(c);
    return 0;
}

在这里插入图片描述

6.5指针与动态内存申请

一般数组一开始就定义了比如a[10]但用着用着发现数组长度这些不够用了,所以引入了动态内存申请
malloc返回的是无类型指针,好比向校长申请一块空地,但是校长不知道我要用这块空地干什么,而且直接分给我,我在自己分配
无类型指针不能偏移,也就是作用上少,所以强制类型转换

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main() {
    int size;//代表我们要申请多大字节的空间
    char *p;
    scanf("%d",&size);
    //malloc返回的void*代表无类型指针,而void*类型的指针是不能偏移的
    p= (char*)malloc(size);//所以这里要强制类型转换
    p[0]='H';
    p[1]='O';
    p[2]='W';
    p[3]='\0';
//    strcpy(p,"malloc success");
    puts(p);
    return 0;
}

或者直接把一段字符串复制给p数组

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main() {
    int size;//代表我们要申请多大字节的空间
    char *p;
    scanf("%d",&size);
    //malloc返回的void*代表无类型指针,而void*类型的指针是不能偏移的
    p= (char*)malloc(size);//所以这里要强制类型转换
//    p[0]='H';
//    p[1]='O';
//    p[2]='W';
//    p[3]='\0';
    strcpy(p,"malloc success");
    puts(p);
    return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main() {
    int size;//代表我们要申请多大字节的空间
    char *p;
    scanf("%d",&size);
    //malloc返回的void*代表无类型指针,而void*类型的指针是不能偏移的
    p= (char*)malloc(size);//所以这里要强制类型转换
//    p[0]='H';
//    p[1]='O';
//    p[2]='W';
//    p[3]='\0';
    strcpy(p,"malloc success");
    puts(p);
    free(p);//释放申请的空间
    return 0;
}

我们自己申请的空间就要还,不是申请的就不用

未完……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv_c++学习(二十八)

一、单目相机位姿估计 如上图所示&#xff0c;根据图像的情况反推相机的运动情况。 如实现上述功能则需要拍摄当前物体的图像&#xff0c;然后拍摄一段时间之后物体的图像&#xff0c;然后联合两张图像则可以获取两个时刻的相机位姿关系。 位姿估计函数&#xff1a; bool cv:s…

Musl libc 库成功适配到 openEuler Embedded,推动欧拉嵌入式生态发展

近期&#xff0c;RISC-V SIG 在欧拉嵌入式操作系统上成功实现了 musl libc 的适配&#xff0c;完成了使用 musl libc 库替换 glibc 库构建镜像的工作。目前&#xff0c;以 musl libc 为基础库编译的镜像已在 Raspberry Pi4 开发板上可用&#xff0c;这一成果推动了 openEuler E…

C Primer Plus第十一章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.设计并测试一个函数&#xff0c;从输…

《Opencv3编程入门》学习笔记—第二章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第二章 OpenCV 官方例程引导与赏析 openv官方提供的示例程序&#xff1a;具体位于..\opencv\sources\samples\cpp ..\opencv\sources\samples\cpp\tutorial_code路径下存…

sql优化常用的方法

文章目录 1、explain 输出执行计划2、in 和 not in 要慎用3、少用select *4、善用limit 15、 order by字段建索引6、count(*)推荐使用7、where 子句中避免is null /is not null8、应尽量避免在 where!或<>9、应尽量避免在 where 子句中使用 or10、尽量用union all代替uni…

了不起的互联网老男孩,在创业路上不掉队

“青春如同奔流的江河&#xff0c;一去不回来不及道别”&#xff0c;老男孩这首歌戳中了太多职场中年男人的心酸苦楚&#xff0c;面对经济下行压力、互联网行业变革以及中年职场危机&#xff0c;互联网人应该如何应对&#xff1f;如何建立和现实叫板的能力&#xff1f; 有2位在…

shiro入门实战

​​​​​​​Apache Shiro | Simple. Java. Security. java语言编写 架构 shiro认证流程 使用 添加shiro依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.0</version>&l…

V2.0-在记事本功能上添加fork和wait

第一篇只是简单使用了open&#xff0c;read,write,lseek实现了基本的记事本功能&#xff1b; 但是当前的系统是linux&#xff0c;应该发挥他的多进程&#xff0c;多线程的作用&#xff1b; 所以&#xff0c;本篇添加创建子进程和父进程等待子进程退出的功能。 有几个注意点&a…

如何创建新一代Web3企业

日前&#xff0c;我们对话了Sui基金会的增长负责人Koh Kim&#xff0c;对如何成功构建持续发展的企业等话题展开讨论。 您在Sui基金会的工作重点帮助开发者&#xff0c;让他们从产品开发的早期阶段成长为强大且具有潜力的企业领导者。可以简单分享一下您为此目标创建的计划吗&…

Linux进程地址空间——下篇

目录 一.深入了解进程地址空间&#xff1a; 单个进程与进程地址空间与物理内存之间的联系图&#xff1a; 多个进程与进程地址空间与物理内存之间的联系图&#xff1a; 二.为什么会存在进程地址空间呢&#xff1f; 作用1&#xff1a;进程地址空间的存在&#xff0c;保证了其他…

Flutter 笔记 | Flutter 文件IO、网络请求、JSON、日期与国际化

文件IO操作 Dart的 IO 库包含了文件读写的相关类&#xff0c;它属于 Dart 语法标准的一部分&#xff0c;所以通过 Dart IO 库&#xff0c;无论是 Dart VM 下的脚本还是 Flutter&#xff0c;都是通过 Dart IO 库来操作文件的&#xff0c;不过和 Dart VM 相比&#xff0c;Flutte…

6.1 进程的创建和回收

目录 进程概念 程序 进程 进程内容 进程控制块 进程类型 进程状态 常用命令 查看进程信息 进程相关命令 进程的创建和结束 子进程概念 子进程创建-fork 父子进程 进程结束-exit/_exit 进程结束-exit-示例1 进程结束-exit-示例2 进程回收 进程回收-wait 进程回…

企业数字化转型,为什么会加快商业智能BI的发展

对于企业数字化转型来说&#xff0c;数据是其中提到最多的词汇。当今世界&#xff0c;随着人们认识到数据的重要性&#xff0c;明白了数据发挥价值的方式及其意义&#xff0c;数据资产就成为数字化转型企业需要掌握利用的关键。 数据可视化 - 派可数据商业智能BI可视化分析平台…

服务windows服务+辅助角色服务

1、vs2022新建一个windows服务项目 2、修改服务参数 &#xff08;1&#xff09;AutoLog: 是否将事件写入到windows的事件日志中。 &#xff08;2&#xff09;canpauseandContinue:服务是否可以暂停和继续 3、添加服务安装程序 在界面内右击鼠标 新建一个服务、新建后如下图&a…

【运维】speedtest测试

目录 docker 布署 布署云端 docker布署 云端放置于已有容器里 librespeed/speedtest: Self-hosted Speedtest for HTML5 and more. Easy setup, examples, configurable, mobile friendly. Supports PHP, Node, Multiple servers, and more (github.com) docker 布署 获取…

探讨生产环境下缓存雪崩的几种场景及解决方案

本文首发自「慕课网」&#xff08;www.imooc.com&#xff09;&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"或慕课网公众号&#xff01; 作者&#xff1a;大能 | 慕课网讲师 缓存我们经常使用&#xff0c;但是有时候我们…

如何撤消 Git 中最新的本地提交?

在使用Git进行版本控制时&#xff0c;有时我们可能会犯下错误或者想要撤销最新的本地提交。Git提供了一些强大的工具和命令&#xff0c;使我们能够轻松地撤消最近的提交并修复错误。 本文将详细介绍如何在Git中撤消最新的本地提交。 步骤1&#xff1a;查看提交历史 在撤消最新…

Centos7安装Java8(在线安装避坑详细安装)

开篇语&#xff1a; 喜欢在一个明媚阳光的午后 坐在那夕阳斑驳的南墙下 听着风起 闻着花香 望着远山 身边是你 如此便觉得很好 1.查看目前环境 rpm -qa|grep jdk在这里我们会发现&#xff0c;原有系统安装有jdk&#xff0c;如果对于jdk有要求&#xff0c;我们就需要重新安装jdk…

Liunx网络基础(3)传输层(TCP/UDP)可靠传输、字节流传输等

传输层协议 传输层协议解析: 负责两端之间的数据传输; TCP/ UDP 1. UDP UDP: 用户数据报协议&#xff0c;无连接&#xff0c;不可靠&#xff0c;面向数据报传输 重点: 协议格式&#xff0c;协议特性&#xff0c;特性对于编程的影响 协议格式&#xff1a; 16位源端口 & 16位…

2023-05-29 用 fltk gui库编写一个打字练习程序

用 fltk gui库编写一个打字练习程序 前言一、FLTK GUI 库二、使用步骤1.引入库2.使用代码 总结 前言 给孩子练习键盘打字, 发现终端还是欠点意思, 研究了一下gui, 最终用 fltk库弄了一个. 对于没有接触过gui的人, 发现, 编程的逻辑和终端区别很大, 很繁琐, 可能需要适应适应,…