资源简介 (共16张PPT)C 语言程序设计2023翻转课堂实用教程9.1 指针123指针的概念指针变量的定义与使用指针变量的运算知识点指针的案例分析案例分析指针相关练习题练习题9.1.1 指针知识点程序在运行时,会为变量分配内存空间。分配的内存空间会有一个唯一的地址编号,在C语言中又叫做指针。通过指针可以找到该内存单元。地址取值范围:(32位系统为例)32位系统的内存条,32个元件,232个组合 =4*230,4GB内存。内存地址编号从0X00000000到0XFFFFFFFF(十六进制表示)指针的概念指针变量保存某个内存空间的地址,并对该内存空间中的值进行操作。指针变量的定义方式为:数据类型名* 指针变量名; 或者 数据类型名* 指针变量名 = 地址值;1.指针变量的定义与使用指针变量指向的变量的数据类型指针变量声明符保存的是某个变量的地址int *pInt ; //指向int型变量的指针char *pStr = NULL; //NULL为空指针,stdio.hint *pInt1,*pInt2;9.1.1 指针知识点举例:double num = 3.14;double *pDouble = # //定义一个指向double型变量num的指针pDouble1.指针变量的定义与使用指针变量pDouble指向num示意图&num3.14pDouble num&取地址运算符,num的地址pDouble指向num9.1.1 指针知识点指针变量占用的内存大小,仅与地址信息的大小有关,与类型无关。#include int main(){int a = 100;char c = 'C';double d = 3.14;int *pInt = &a;char *pStr = &c;double *pDouble = &d;//分别输出int指针、字符指针、浮点型指针占用的字节数printf("%d %d %d",sizeof(pInt),sizeof(pStr),sizeof(pDouble));return 0;}1.指针变量的定义与使用运行结果(64位系统,8个字节)8 8 89.1.1 指针知识点(1)取内容与取地址通过变量的地址/指针,同样可以访问到该变量的值。#include int main (void){int *p,a = 3;p = &a;//两种获取变量a的方式,*p 和 a等价。printf("*p的值为:%d, a的值为:%d\n",*p,a);*p = 6; //通过指针p可以修改a的值printf("*p的值为:%d, a的值为:%d\n",*p,a);return 0;}2.指针变量的运算取内容,*p:p指向的变量a的值,等价取地址,&a:a的地址运行结果:*p的值为:3, a的值为:3*p的值为:6, a的值为:6&a3p a*p9.1.1 指针知识点(2)赋值运算double num = 3.14,value =0.618 ;double *pDouble1 = &num,pDouble2; //(a)pDouble1 = &value; //(b)修改pDouble1的值,让其指向value变量pDouble2 = pDouble1; //(c)2.指针变量的运算(a)(b)(c)9.1.1 指针知识点(3)加法、减法和比较运算指针变量还可以进行加法、减法和比较运算,一般当指针变量指向数组中的元素时,才有实际的含义。2.指针变量的运算9.1.1 指针知识点指针变量只能与整数常量i进行加减法运算,加或减同类型数据长度的i倍,指针往后或往前移动i个同类型的数据。指针pI的加减运算图#includeint main(){int a = 30,*p = &a,*pI = &a;double b = 3.14,*pD = &b;char c = 'C',*pC = &c;//前3个输出语句,输出各个类型占用的字节数printf("sizeof(int) is %d\n",sizeof(int));printf("sizeof(double) is %d\n",sizeof(double));printf("sizeof(char) is %d\n",sizeof(char));printf("初始值 , pI:%#X,pD:%#X,pC:%#X\n",pI,pD,pC); //第4个输出,先输出各个指针的最初值pI --; pD = pD-1; pC--; //第5个输出,输出-1后的值printf("地址-1后,pI:%#X,pD:%#X,pC:%#X\n",pI,pD,pC);pI += 2; pD +=2;pC+=2; //第6、7个输出printf("地址+2后,pI:%#X,pD:%#X,pC:%#X\n",pI,pD,pC);printf("*pI:%d,*pD:%f,*pC:%c\n",*pI,*pD,*pC);if(p == pI) printf("p和pI值相同,指向同一变量。"); //第8个输出,比较p和pI指针else printf("p和pI值不同。");return 0;}9.1.1 指针知识点运行结果:sizeof(int) is 4sizeof(double) is 8sizeof(char) is 1初始值 ,pI:0X62FE04,pD:0X62FDF8,pC:0X62FDF7地址-1后,pI:0X62FE00,pD:0X62FDF0,pC:0X62FDF6地址+2后,pI:0X62FE08,pD:0X62FE00,pC:0X62FDF8*pI:6487544,*pD:0.000000,*pC:p和pI值不同。(3)加法、减法和比较运算%#X是输出以0X开头的十六进制地址。9.1.2 指针案例分析案例9.1.1指针变量运算案例分析#include int main (void){int *p,*pI,a = 3;double *pD, num = 0.618;pI = &a; // p指向aprintf("*pI的值为:%d, a的值为:%d\n\n",*pI,a);//修改a变量的值,*p的值也跟着改变a = 33 ;printf("*pI的值为:%d, a的值为:%d\n\n",*pI,a);//修改*p变量的值,a的值也跟着改变(*pI)++;printf("*pI的值为:%d, a的值为:%d\n\n",*pI,a);//同类型的指针可以相互赋值,两者指向同一个变量ap = pI;printf("*p的值为%d, *pI的值为%d,a的值为%d\n",*p,*pI,a);//以十六进制形式输出p和pI的值,均为a的地址printf("a的地址为%#0X;",&a);printf("p和pI的值为%#0X和%#0X\n\n",p,pI);pD = #//*pD就是num的值0.618,*p就是a的值34*pD = *pD + *p;//执行完上面代码后,*pD和num的值均变为了34.618printf("*pD的值为:%f,num的值为:%f",*pD,num);return 0;}*pI的值为:3, a的值为:3*pI的值为:33, a的值为:33*pI的值为:34, a的值为:34*p的值为34, *pI的值为34,a的值为34a的地址为0X62FE04;p和pI的值为0X62FE04和0X62FE04*pD的值为:34.618000,num的值为:34.618000课堂练习题9.1.1 写出执行下面程序后的输出结果#includeint main(){int a = 2,b= 3;int *p1 = &a,*p2 = &b;printf("p1指向的值为:%d,p2指向的值为%d\n",*p1,*p2);p2 = p1;*p2 = b;printf("p1指向的值为:%d,a的值为%d",*p1,a);return 0;}9.1.3 指针课堂练习题课堂练习题9.1.2 查找下面程序中的2处错误。输入a和b,并定义指针p1和p2分别指向a和b,通过取指针值的方式计算a和b的和,并输出和。#includeint main(){int a,b;int *p1,*p2;p1 = &a,p2=&b;scanf("%d %d",&a,&p2);printf("a + b = %d",p1+*p2);return 0;}课堂练习题9.1.3 参照案例9.1.1,自行设计一个对指针操作的程序,并分析程序运行的结果。9.1.3 指针课堂练习题9.3.3 指针与数组课堂练习题课堂练习题9.3.2:写出执行下面程序后的输出结果#includeint main(){int i;int a[10] = {1,2,3,4,5,6,7,8,9,0};int *p,*p1,*p2;p1 = &a[2],p2 = a+9;for(p = p1;p<=p2;p++){printf("%d ",*p);}printf("\n");for(p = a,i=0;i<6;i++){printf("%d ",p[i]);}return 0;}课堂练习题9.3.3:定义函数,采用传递数组指针的方式求解阶乘谢谢观看程序设计基础 展开更多...... 收起↑ 资源预览