ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C语言学习笔记十一—— 预处理(补充)· 指针入门

C语言学习笔记十一—— 预处理(补充)· 指针入门 第一部分预处理1. 预处理总结【预处理】→ 本质上都是做文本替换预处理不是 C 语言的一部分预处理命令都是以#开头宏定义工作的过程本质文本替换文件包含条件编译。2. 文件包含#include文件名// 默认到系统的标准路径下寻找要包含的头文件#include文件名// 双引号默认先到当前位置下寻找要包含的头文件// 如果找到则包含进来如果没找到才去系统的标准路径下寻找#includestdio.h说明include这个预处理命令执行之后用文件中的内容替换这个命令所在位置将来使用 如果是系统的相关头文件用 如果是自己写的一般用。3. 条件编译语法格式一#if 0#if0……#endif语法格式二#ifdef 标识符判断标识符是否定义#ifdef标识符语段1#else语段2#endif语义判断标识符是否定义了定义了真→ 选择语段1没定义假→ 选择语段2。语法格式三#ifndef 标识符判断标识符是否未定义#ifndef标识符程序段1#else程序段2#endif语义没有定义 → 程序段1定义了 → 程序段2。语法格式四#if 表达式#if表达式程序段1#else程序段2#endif语义表达式为真非 0→ 程序段1表达式为 0 → 程序段2。用途条件编译可以用来实现多文件编程。4. 多文件编程printf 为例printf // 系统里的函数 #include stdio.h printf();实现好的功能.c独立的 C 程序提供或打包成库文件一个写好了功能的.c文件对应有一个.h头文件.c实现功能的具体代码函数.h头文件放的是自身需要用到的宏、类型说明、函数声明。第二部分指针入门1. 指针的概念与重要性指针是 C 语言中的一个重要概念也是 C 语言的一个重要特色。正确而灵活地运用它可以有效地表示复杂的数据结构// 下一个阶段数据结构能动态分配内存 // 指针提供了一个能力——直接使用内存方便地使用字符串有效而方便地使用数组在调用函数时能获得 1 个以上的结果能直接处理内存单元地址等这对设计系统软件是非常必要的。掌握指针的应用可以使程序简洁、紧凑、高效。每一个学习和使用 C 语言的人都应当深入地学习和掌握指针。可以说不掌握指针就是没有掌握 C 的精华。2. 指针的难度指针本身抽象指针可以和前面学过的几乎所有内容关联起来指针 普通变量指针 数组指针 函数指针 指针3. 指针是啥计算机的内存是按字节进行编址的——一个字节一个地址编号地址。地址通过地址信息可以知道想要的目标看地址值本身也是一种数值能不能像普通变量一样也开一块空间来存放这个值引出——指针的概念。指针pointer——指针就是地址地址就是内存单元的编号。想要存储或处理指针这种数据怎么办设计了一种数据类型叫指针类型。inta10;// a 是 int 类型int 类型一种整数类型——用来处理整数这种数据以及相关运算指针类型一种数据类型——用来处理指针这种数据以及相关运算。指针数据和整型数据的区别房间编号 1000 数值 1000 内存单元编号 1000指针就是地址地址就是内存单元编号指针值指针数据就是内存单元编号地址指针类型专门处理地址内存单元编号这种数据地址不是单纯的数值而是具有地址含义的数值。4. 语法定义指针变量定义指针变量的一般形式基类型 * 指针变量名; (1) (2) (3)说明基类型表示指针地址所指向的空间的数据类型*定义指针变量时只是用来说明该变量是指针类型指针变量名标识符和普通变量的命名规则一致。inta10;int*p;// 定义了一个指针变量 p// 定义了一个指向 int 型数据的指针变量 p// 定义了指针变量意味着也要开空间空间开多大取决于 p 对应的数据类型——指针类型int*32 位系统地址大小统一 32 位 → 4 个字节64 位系统地址大小统一 64 位 → 8 个字节。inta10;int*pa;// a 取地址运算取到 a 所在空间的起始地址5. 指针的使用间接引用对于 a 这块空间的使用有两种方式直接引用直接通过 a 使用间接引用指针的方式。inta10;int*pa;step1找通过 p 本身可以得到 a 所在空间的地址通过 p 只是能找到 astep2用能不能用 a 所在的空间* 运算数 // 指针运算符解引用运算数必须是地址*p的运算过程step1拿出 p 中地址编号到内存中寻找 // 找 step2从定位处开始偏移出 sizeof(基类型) 大小的一块空间 // 用 step3将偏移出的这块空间当做一个基类型变量来看 *p 运算结果 相当于是一个 int 型变量6. 考点大小端// 练习实现一个函数测试电脑大小端intIsLitteEndian(){inta0x12345678;short*p(short*)a;printf(*p %#x\n,*p);}intmain(void){IsLitteEndian();return0;}7. 为什么需要指针—— 被调修改主调intaddOne(int*p){*p*p1;// p p 1;}intmain(void){intn10;// 主调函数中有一个变量想在被调函数中对这个变量进行修改addOne(n);}被调被调函数被调用函数主调主动调用的函数需要用到地址指针→可以实现被调修改主调。注意被调修改主调要修改谁就传谁的地址在被调函数中一定要有相应的*p运算。传地址的方式地址传参地址传递——可以实现被调修改主调值传递改不了。说明指针 80% 以上的用途都是来干这个事情的。例子time 函数#includetime.htime_ttime(time_t*tloc);// 方式1通过返回值获得time_tttime(NULL);// 方式2通过指针的形参time_tt;time(t);8. 练习代码留空自行补充// 练习1实现两个数求和要求不通过返回值方式带出结果voidsum(inta,intb,int*ret){*retab;}intmain(void){inta,b,ret;scanf(%d %d,a,b);sum(a,b,ret);printf(sum %d\n,ret);return0;}// 练习2实现一个函数一次性得到两个整数的和和差voidtow(inta,intb,int*h,int*c){*hab;*ca-b;}intmain(void){inta,b,r1,r2;scanf(%d %d,a,b);tow(a,b,r1,r2);printf(sum %d\ndif %d\n,r1,r2);return0;}// 练习3实现一个函数找出两个数中的最大值和最小值voidmm(inta,intb,int*max,int*min){if(ab){*mina;*maxb;}else{*minb;*maxa;}}intmain(void){inta,b,max,min;scanf(%d %d,a,b);mm(a,b,max,min);printf(max %d\nmin %d\n,max,min);return0;}9. 指针操作数组inta[10]{1,2,3,4,5,6,8,9,10};数组特点1. 连续性2. 单一性类型一致3. 有序性按顺序存放。通过指针操作数组谁能代表数组所在空间起始位置——数组名从值的角度数组名代表数组首元素的地址首元素地址也是整个数组的起始地址知道了首元素地址就能访问首元素。int*pa;// 等价于 a[0]// a[0] 是 int 类型// a[0] 取了一个存放 int 型数据空间的地址 → int *10. 指针运算p 1 // 地址加了 1 个基类型大小 p N // 地址加了 N 个基类型大小 p - 1 // 地址减了 1 个基类型大小 p - N // 地址减了 N 个基类型大小 p // 指针自增 p-- // 指针自减 p - q // 必须是同类型指针表示差了几个基类型关系运算 !p q // 地址编号编号大的就大指针操作数组因为数组的特点只需要知道首元素地址即可指针运算p N指针*运算p i 第 i 个元素的地址i 可以是 0 1 2 ... *(p i) 第 i 个元素变量等价于 a[i] a[i] *(p i) a[i] *(a i)后面还有整型二维、字符型一维、字符型二维的指针操作。11. 练习与作业代码留空自行补充// 练习通过指针的方式找出数组中的最大值写成函数voidprintfArray(int*a,intlen){inti0;for(i0;ilen;i){printf(%d ,*(ai));}}voidm(int*p,int*max,intlen){inti0;*maxp[0];for(i1;ilen;i){if(*(pi)*max){*max*(pi);}}}intmain(void){inta[10]{23,65,98,74,52,15,36,30,25,75};intmax0;printfArray(a,10);m(a,max,10);printf(max %d\n,max);return0;}// 作业通过指针的方式实现数组逆序voidprintfArray(int*a,intlen){inti0;for(i0;ilen;i){printf(%d ,*(ai));}}voidnx(int*p,intlen){inti0;inttemp0;*pp[0];for(i0;ilen/2;i){temp*(pi);*(pi)*(p9-i);*(p9-i)temp;}}intmain(void){inta[10]{1,2,3,4,5,6,7,8,9,10};printfArray(a,10);printf(\n);nx(a,10);printfArray(a,10);printf(\n);return0;}
返回列表