第十章指针 学习目的与要求:1.理解地址和指针的概念 2.重点掌握指针变量的定义和引用 3.重点掌握指向数组的指针和通过指向数组的指针操纵数组 4.重点掌握指向字符串的指针和通过指向字符串的指针操纵字 符串 5.理解指向指针的指针、指针数组等概念 1.指针变量的定义和引用。 2.指向数组的指针和通过指向数组的指针操纵数组。 3.指向字符串的指针和通过指向字符串的指针操纵字符串 第1讲 知识归纳 1.地址和指针的概念 (1)地址:内存区的每一个字节的编号。 (2)指针:一个变量的地址称为该变量的指针,即地址就是指针,指针就是地址。 2.指向变量的指针变量 (1)指针变量:是指专门用来存放变量地址的一类变量。 (2)注意区分指针和指针变量的概念。 指针是地址;指针变量是存放地址的变量。 平时所说的定义一个指针,实际上是指定义一个指针变量。 3.指针变量的定义和引用 (1)定义指针变量格式:基类型*指针变量名 (2)如何确定指针变量的类型:要定义的指针准备指向什么类型变量,该指针就是什 么类型 (3)如何将一个指针指向一个变量:将变量的地址赋值给指针变量 &一取地址运算符 如:inta=5 int pa=&a (4)指针变量的引用
第十章 指 针 学习目的与要求:1. 理解地址和指针的概念。 2. 重点掌握指针变量的定义和引用。 3. 重点掌握指向数组的指针和通过指向数组的指针操纵数组。 4. 重点掌握指向字符串的指针和通过指向字符串的指针操纵字 符串。 5. 理解指向指针的指针、指针数组等概念。 重点: 1. 指针变量的定义和引用。 2. 指向数组的指针和通过指向数组的指针操纵数组。 3. 指向字符串的指针和通过指向字符串的指针操纵字符串。 第 1 讲 知识归纳 1. 地址和指针的概念 (1) 地址:内存区的每一个字节的编号。 (2) 指针:一个变量的地址称为该变量的指针,即地址就是指针,指针就是地址。 2. 指向变量的指针变量 (1) 指针变量:是指专门用来存放变量地址的一类变量。 (2) 注意区分指针和指针变量的概念。 指针是地址;指针变量是存放地址的变量。 平时所说的定义一个指针,实际上是指定义一个指针变量。 3. 指针变量的定义和引用 (1) 定义指针变量格式: 基类型 * 指针变量名 ; (2) 如何确定指针变量的类型:要定义的指针准备指向什么类型变量,该指针就是什 么类型; (3) 如何将一个指针指向一个变量:将变量的地址赋值给指针变量; &—取地址运算符; 如:int a =5 ; int * pa ; int pa = &a ; (4) 指针变量的引用:
二部分语言程序设计同步训练 231 *一取内容运算符,该运算符与指针变量结合,表示指针所指向的变量的内容 int a=5 int pa=&a 如: printf(“%d,%dn”,* a); 下面是错误的 printf(%dⅦn”,*pa) ∥一个指针在没有指向一个确切的存储空间时,是不能使用 4.指针总结 Int a=s 在定义指针并指向某个变量后,我们可以得出如下结论 (1)*pa等价于a (2)pa等价于&a (3)&*pa等价于&a、pa (4)*&a等价于a 基础训练(A) 选择题 1.已知:int*pa;则语句p=&a,”中的运算符“&”的含义是() A)位与运算B)逻辑与运算 C)取指针内容 D)取变量地址 2.已知: double d;希望指针变量pd指向d,下面对指针变量pd的正确定义是()。 A) double pd; B)double &pd double *pd D)double "(pd) 3.若ⅹ为整型变量,p是指向整型数据的指针变量,则正确的赋值表达式是() )p=&x B)p= C)*p=&x 、填空题 1.要使指针变量与变量之间建立联系,可以用运算符 来定义一个指针变 量,用运算符来建立指针变量与变量之间的联系。 2.已知:inta=10,p=&a;则 printf(%d,%dn",a,*p)”的输出结果是 3.已知: float fI=3.2,n,*pl=&tl;现在希望变量f2的值为32,可使用赋值语句 4.已知:intb=5,*p=&b;并且b的地址为4000,则“prit("%ad,%d"p,*p):”的输出结果 、阅读程序,回答问题 1. maino i int var,*p; var=l00
第二部分 C 语言程序设计同步训练 ·231· ·231· *—取内容运算符,该运算符与指针变量结合,表示指针所指向的变量的内容; int a=5 int *pa; int pa=&a; 如:printf (“ % d ,%d\n ”, * pa , a ) ; 下面是错误的: int * pa ; printf (“ % d \n ”, * pa ) ; //一个指针在没有指向一个确切的存储空间时,是不能使用 * pa 4. 指针总结 int a = 5 ; int * pa =&a ; 在定义指针并指向某个变量后,我们可以得出如下结论。 (1) *pa 等价于 a (2) pa 等价于 &a (3) & * pa 等价于 &a 、 pa (4) * &a 等价于 a 基础训练(A) 一、选择题 1. 已知:int *p,a;则语句“p=&a;”中的运算符“&”的含义是( )。 A) 位与运算 B) 逻辑与运算 C) 取指针内容 D) 取变量地址 2. 已知:double d;希望指针变量 pd 指向 d,下面对指针变量 pd 的正确定义是 ( )。 A) double pd; B) double &pd C) double *pd D) double *(pd) 3. 若 x 为整型变量,p 是指向整型数据的指针变量,则正确的赋值表达式是( )。 A)p=&x B)p=x C)*p=&x D)*p=*x 二、填空题 1. 要使指针变量与变量之间建立联系,可以用运算符 来定义一个指针变 量,用运算符 来建立指针变量与变量之间的联系。 2. 已知:int a=10,*p=&a;则“printf("%d,%d\n",a,*p);”的输出结果是 。 3. 已知:float f1=3.2,f2,*pf1=&f1;现在希望变量 f2 的值为 3.2,可使用赋值语句 或 。 4. 已知:int b=5,*p=&b;并且 b 的地址为 4000,则“printf("%d,%d",p,*p);”的输出结果 是 。 三、阅读程序,回答问题。 1. main() { int var, *p; var=100; p=&var;
C语言程序设计上机指导与同步训练 printf("gd", var); 运行结果: #include void prtv(int *x) printf("器a\n",++*x } main() 运行结果 能力提高(B) 、选择题 1.已知:inta,*p=&a;则下列函数调用中错误的是() A)scanf("%d", &a) B)scanf("%d"p C)printf("%d", a D)printf("%d"p); 2.已知:inti=0j=1,*p=&i,*q=&j;错误的语句是() B)p=&*& 3.函数的功能是交换变量ⅹ和y中的值,且通过正确调用返回交换的结果。能正确执 行此功能的函数是()。 A)funa(int*x, int * y) B)funb(int x, int y) C)func(int*x,int *y D)fund(int*x, int *y) 、阅读程序写出运行结果 1. include viod swap (int, int) 232
·232· C 语言程序设计上机指导与同步训练 ·232· var=*p+10; printf("%d",var); } 运行结果:_____________________。 2. #include void prtv(int *x) { printf("%d\n",++*x); } main() { int a=25; prtv(&a); } 运行结果:_______________________。 能力提高(B) 一、选择题 1. 已知:int a,*p=&a;则下列函数调用中错误的是( )。 A)scanf("%d",&a); B)scanf("%d",p); C)printf("%d",a); D)printf("%d",p); 2. 已知:int i=0,j=1,*p=&i,*q=&j;错误的语句是( )。 A) i=*&j; B) p=&*&i; C)j=*p; D)i=*&q; 3. 函数的功能是交换变量 x 和 y 中的值,且通过正确调用返回交换的结果。能正确执 行此功能的函数是( )。 A) funa(int *x,int *y) { int *p; *p=x; *x=*y; *y=*p; } B) funb(int x,int y) { int t; t=x; x=y; y=t; } C) func(int *x,int *y) { *x=*y; *y=*x; } D) fund(int *x,int *y) { int t; t=*x; *x=*y; *y=t; } 二、阅读程序写出运行结果 1. # include viod swap (int,int) main()
第二部分¢语言程序设计同步训练 printf ("before swap a=kd, b=sd\n", a, b) swap(a, b)i swap(int 运行结果: 2. #f include id printf("before swap a=kd, b=d\n", a, b) printf("after swap a=gd, b=sd\n", a, b) temp=*px *px=*py py=temp printf("in swap x=%d, y=sd\n",*px, *py); 运行结果 比较上面两个程序,试说明两者的区别 第2讲 知识归纳 1.指针变量做实参 (1)指针变量做实参,实质传的是指针所指向的变量的地址即传地址调用 (2)指针变量做实参,形参必须是指针,即通过形参指针操纵主调函数中的变量。 2.指向数组的指针变量 (1)定义一个指向数组元素的指针变量的方法,与定义指向变量的指针变量相同 (2)使指针指向数组首地址:将数组名赋值给已定义的指针变量 使指针指向数组的某一元素:将数组元素地址赋值给已定义的指针变量。 int arr[ 10; Int云 p ∥定义指针变量,类型与将要指向的数组类型一致
第二部分 C 语言程序设计同步训练 ·233· ·233· { int a,b; a=5;b=10; printf("before swap a=%d,b=%d\n",a,b); swap(a,b); printf("after swap a=%d,b=%d\n",a,b); } swap(int x,int y) { int temp; temp=x; x=y; y=temp; printf("in swap x=%d,y=%d\n",x,y); } 运行结果:____________________。 2. # include void swap(int,int); main() { int a,b; a=5;b=10; printf("before swap a=%d,b=%d\n",a,b); swap(&a,&b); printf("after swap a=%d,b=%d\n",a,b); } swap(int *px,int *py) { int temp; temp=*px; *px=*py; *py=temp; printf("in swap x=%d,y=%d\n",*px,*py); } 运行结果:_____________________。 比较上面两个程序,试说明两者的区别? 第 2 讲 知识归纳 1. 指针变量做实参 (1) 指针变量做实参,实质传的是指针所指向的变量的地址即传地址调用。 (2) 指针变量做实参,形参必须是指针,即通过形参指针操纵主调函数中的变量。 2. 指向数组的指针变量 (1) 定义一个指向数组元素的指针变量的方法,与定义指向变量的指针变量相同。 (2) 使指针指向数组首地址:将数组名赋值给已定义的指针变量。 使指针指向数组的某一元素:将数组元素地址赋值给已定义的指针变量。 如:int arr[ 10 ]; int * p ; //定义指针变量,类型与将要指向的数组类型一致;
C语言程序设计上机指导与同步训练 p=arr i p指针指向ar数组的首地址;等价于p=&ar] &a9 ∥p指针指向a数组的最后一个元素ar9] 3.通过指针引用数组元素 int arr[ 10]: 在定义指针,并指向某个数组的首地址后,我们可以得出如下结论 p+i=arr+i=&ar[i],均表示ar数组的第i个元素的地址 指针变量加1,即在指针当前所指向的元素的地址基础上+一个数组元素的字节数 即p+idd是一个数组元素的字节数 (p+i)=(ar+i)=ar(,均表示ar数组的第i个元素 (3)数组元素的两种表示方法 下标法:ar[i],p[i ∥均表示arr数组的第i个元素 指针法:*(p+i),*(ar+i)均表示ar数组的第i个元素; 4.在使用指向数组的指针变量时,应注意的问题 int arr[ 10]: nt幸p=arr 在定义指针,并指向某个数组的首地址后 (1)p艹+;正确;但ar+;不正确 因为ar表示数组名,是常量,不能执行ar=arr+1 (2)要注意指针变量的当前值 (3)(*p)艹一表示p所指向的元素值加1;即ar[0+ p艹+、*(p++)一先取指针所指向空间的内容,即aro,然后指针pa下移一个 存储空间,指向ar[11; (4)*++pa一指针pa先下移一个存储空间,然后取指针所指向空间的内容 基础训练(A) 选择题 1.已知:inta[10]*p=a;则下面说法不正确的是() A)p指向数组元素a0] B)数组名a表示数组中第一个元素的地址 C)inta[10*p=&a[0];与上述语句等价 D)以上均不对 2.已知:inta[10J={1,2,3,4,56,89,10},*p=a,则不能表示数组a中元素的表达式是 B)a[101 D )a[p-al 234
·234· C 语言程序设计上机指导与同步训练 ·234· p = arr ; //p 指针指向 arr 数组的首地址;等价于 p = & arr[0]; p = &a [ 9] ; // p 指针指向 arr 数组的最后一个元素 arr[9] ; 3. 通过指针引用数组元素 int arr[ 10 ]; int * p = arr ; 在定义指针,并指向某个数组的首地址后,我们可以得出如下结论: p + i =arr + i = &arr[ i ] ,均表示 arr 数组的第 i 个元素的地址 ; 指针变量加 1 ,即在指针当前所指向的元素的地址基础上+ 一个数组元素的字节数 ; 即 p + i*d //d 是一个数组元素的字节数; *(p+i) = *(arr + i) = arr[i] , 均表示 arr 数组的第 i 个元素; (3) 数组元素的两种表示方法: 下标法: arr[ i ] , p [ i ] // 均表示 arr 数组的第 i 个元素; 指针法: * ( p+i) , * (arr+i) //均表示 arr 数组的第 i 个元素; 4. 在使用指向数组的指针变量时,应注意的问题 int arr[ 10 ]; int * p = arr ; 在定义指针,并指向某个数组的首地址后: (1) p ++ ; 正确 ;但 arr++ ; 不正确 ; 因为 arr 表示数组名 ,是常量,不能执行 arr = arr + 1 ; (2) 要注意 指针变量的当前值; (3) ( * p ) ++ —表示 p 所指向的元素值加 1;即 arr [ 0] ++ ; * p ++ 、* ( p ++ ) —先取指针所指向空间的内容, 即 arr[0],然后指针 pa 下移一个 存储空间, 指向 arr[1] ; (4) * ++pa —指针 pa 先下移一个存储空间,然后取指针所指向空间的内容。 基础训练(A) 一、选择题 1. 已知:int a[10],*p=a;则下面说法不正确的是 ( )。 A) p 指向数组元素 a[0] B) 数组名 a 表示数组中第一个元素的地址 C) int a[10],*p=&a[0];与上述语句等价 D) 以上均不对 2. 已知:int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则不能表示数组 a 中元素的表达式是 ( )。 A)*p B)a[10] C)*a D)a[p-a]
第二部分¢语言程序设计同步训练 235· 、填空题 1.在C语言中,指针变量的值增1,表示指针变量指向下一个 ,指针 变量中具体增加的字节数由系统自动根据指针变量的 决定。 2.已知:inta[5]*p=a;则p指向数组元素ao,那么p+1指向 若“ printf("d"p);” 的输出结果是200,那么:“ printf("%d"p+1);”的输出结果是」 3.对数组元素的引用方法有两种 。设inta[0*p=a;则对a[3] 的引用可以是 或 4.在C程序中,可以通过三种运算来移动指针: 5.设有如下定义 nta[5}={0,1,2,34},*pl=&a[1*p2=&a[4则p2-p1的值为 p2-*pl的值 为 三、阅读程序写出运行结果 maI i int a[10],i,*p for(i=0;i=a; p--) printf("旨d",*p) 执行程序,输入:0123456789 运行结果 能力提高(B) 、选择题 1.已知inta={1,2,3,4}y*p=&a[则执行语句y=*p++;"之后变量y的值为() 2.已知nta={1,2,3,4},y*p=&a0则执行语句y=+(*p),"之后,下面()元素的值 发生了变化。 A)alol B)all] D)都没发生变化
第二部分 C 语言程序设计同步训练 ·235· ·235· 二、填空题 1. 在 C 语言中,指针变量的值增 1,表示指针变量指向下一个 ,指针 变量中具体增加的字节数由系统自动根据指针变量的 决定。 2. 已知:int a[5],*p=a;则p指向数组元素a[0],那么p+1指向 。若“ printf("%d",p);” 的输出结果是 200,那么:“ printf("%d",p+1);”的输出结果是 。 3. 对数组元素的引用方法有两种: 和 。设 int a[10],*p=a;则对 a[3] 的引用可以是 或 。 4. 在 C 程序中,可以通过三种运算来移动指针: 、 、 。 5. 设有如下定义 int a[5]={0,1,2,3,4},*p1=&a[1],*p2=&a[4];则 p2-p1 的值为 ______ ,*p2-*p1 的值 为 。 三、阅读程序写出运行结果 1. main() { int a[10],i,*p; *p=a; for (i=0; i=a; p--) printf("%d",*p); } 执行程序,输入:0 1 2 3 4 5 6 7 8 9 运行结果:______________________。 能力提高(B) 一、选择题 1. 已知:int a[]={1,2,3,4},y,*p=&a[1];则执行语句"y=*p++;"之后,变量 y 的值为 ( )。 A) 3 B) 2 C) 1 D) 4 2. 已知:int a[]={1,2,3,4},y,*p=&a[0];则执行语句"y=++(*p);"之后,下面( )元素的值 发生了变化。 A) a[0] B) a[1] C) a[2] D)都没发生变化
C语言程序设计上机指导与同步训练 3.已知ntx={1,3,5,79,1,*ptr=x;则能够正确引用数组元素的语句是() B)*(ptr. )x[6] D 4.若有以下语句并且0 main() p=&a[0] ntf("*p=号d,x=旨d,y=dln",*p,x,y); 行结果 2. #include ]={1,2,3,4,5,6} printf("旨d,",*p) printf("8d,",*(++p)) printf("gd, ",*++p) printf("&d,",*(p--)) printf("旨d,器d\n”,*p,*(a+3)) 运行结果: 三、程序填空 1.下面的程序实现从10个数中找出最大值和最小值 void output (int*, int) find max min(int *p, int n) 236
·236· C 语言程序设计上机指导与同步训练 ·236· 3. 已知:int x[]={1,3,5,7,9,11},*ptr=x;则能够正确引用数组元素的语句是 ( )。 A) x B) *(ptr--) C) x[6] D) *(--ptr) 4. 若有以下语句并且 0 main() { int a[]={1,2,3,4,5}; int x,y,*p; p=&a[0]; x=*(p+2); y=*(p+4); printf("*p=%d,x=%d,y=%d\n",*p,x,y); } 运行结果:_______________________。 2. #include main() { int a[]={1,2,3,4,5,6}; int *p; p=a; printf("%d,",*p); printf("%d,",*(++p)); printf("%d,",*++p); printf("%d,",*(p--)); p+=3; printf("%d,%d\n",*p,*(a+3)); } 运行结果:_________________________。 三、程序填空 1. 下面的程序实现从 10 个数中找出最大值和最小值。 void input (int*,int); void output(int*,int); int max,min; find_max_min(int *p,int n)
第二部分¢语言程序设计同步训练 237 printf("input 10 numbers: \n")i find max min(num, 10)i printf("max=是d,min=d\n”,max,min) 四、编程题 1.编写两个函数分别完成一维数组的输入和输出。 void int*, int) void output(int*, int) id void output (int *p, int n 第3讲 知识归纳 1.数组、指针和函数的结合应用 实参类型 变量地址 数组名 数组名或数组元素地址 要求形参的类型 传递的信息 变量的值 变量的地址数组的起始地址|数组的起始地址或数组元素 通过函数调用能不能 否改变实参的值
第二部分 C 语言程序设计同步训练 ·237· ·237· { int *q; max=min=*p; for (q= ; ; q++) if ( ) max=*q; else if ( ) min=*q; } main() { int i,num[10]; printf("input 10 numbers:\n"); for (i=0; i<10; i++) scanf (%d",&num[i]); find_max_min(num,10); printf("max=%d,min=%d\n",max,min); } 四、编程题 1. 编写两个函数,分别完成一维数组的输入和输出。 void input(int*,int); void output(int*,int); main() { int a[10]; input(a,10); output(a,10); } void input(int *p,int n) { } void output(int *p,int n) { } 第 3 讲 知识归纳 1. 数组、指针和函数的结合应用 传值调用 传地址调用 实参类型 变量名 变量地址 数组名 数组名或数组元素地址 要求形参的类型 变量名 指针 数组 指针 传递的信息 变量的值 变量的地址 数组的起始地址 数组的起始地址或数组元素 地址 通过函数调用能 否改变实参的值 不能 能 能 能
·238 C语言程序设计上机指导与同步训练 2.二维数组的地址问题 inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} (1)a—表示数组的首地址;等价于*(a+0)、*a (2)a[i]一表示数组的第i行的行地址,即第i行第一个元素的地址; 等价于*(a+i)、*( (3)&a[i[j]一表示数组的第i行j列元素的地址;等价于*(a+i)+j 和*(p+i)+j (4)a[i[j}一表示数组的第i行j列元素;等价于*(*a+i)+j) 和*(气(p+i)+j) 3.指向二维数组的行指针 inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; t(*p)4]=a (1)int(*p)4]=a 表示p是一个指向二维数组(一行有四个元素的)行地址的行指针 (2)p+1;行指针加1,是加一行元素的字节数的和 p=p+1;行指针从当前行指向下一行; 基础训练(A 、选择题 1.已知nta3][4]*p=a则p表示() A)数组a的0行0列元素 B)数组a的0行0的地址 C)数组a的0行首地址 D)以上均不对 2.已知nta[34]*p;若要指针变量p指向a[oJ,正确的表示方法是() A)p= C)p=* D)P=a[0J[] 3.已知: double b2[3]*p=b;下面哪个不能表示数组b的0行0列元素 A)bloOr B)p C)*plO D)p 4.设有说明int*ptr)[M其中的标识符ptr是() A)M个指向整型变量的指针 B)指向M个整型变量的函数指针 C)一个指向M个整型元素的一维数组的指针 D)具有M个指针元素的一维指针数组,每个元素都只能指向整型变量 、填空题 1.已知:下面程序段中第一个pinf语句的输出是200,则第二个 printf语句的输出 第三个 printf语句输出是 inta[3][4],*p=a; printf("gd",a) printf("旨d",p) 238
·238· C 语言程序设计上机指导与同步训练 ·238· 2. 二维数组的地址问题 int a [3][4] = { 1,2 ,3,4,5,6,7,8,9,10,11,12} ; int * p = a ; (1) a—表示数组的首地址 ; 等价于 *( a + 0 ) 、* a (2) a [ i ] —表示数组的第 i 行的行地址,即 第 i 行第一个元素的地址; 等价于 *( a + i ) 、* ( p + i ); (3) &a [ i ][ j ] —表示数组的第 i 行 j 列元素的地址; 等价于 *( a + i ) +j 和 *( p + i ) +j; (4) a [ i ][ j ]—表示数组的第 i 行 j 列元素;等价于 * ( *( a + i ) +j ) ; 和 * ( *( p + i ) +j ) ; 3. 指向二维数组的行指针 int a [3][4] = { 1,2 ,3,4,5,6,7,8,9,10,11,12} ; int ( * p )[4 ] = a ; (1) int ( * p )[4 ] = a ; 表示 p 是一个指向二维数组(一行有四个元素的)行地址的行指针; (2) p + 1 ; 行指针加 1 ,是加 一行元素的字节数的和; p = p + 1 ; 行指针从当前行指向下一行; 基础训练(A) 一、选择题 1. 已知:int a[3][4],*p=a;则 p 表示 ( )。 A) 数组 a 的 0 行 0 列元素 B) 数组 a 的 0 行 0 的地址 C) 数组 a 的 0 行首地址 D) 以上均不对 2. 已知:int a[3][4],*p;若要指针变量 p 指向 a[0][0],正确的表示方法是 ( )。 A) p=a B) p=*a C) p=**a D) p=a[0][0] 3. 已知:double b[2][3],*p=b;下面哪个不能表示数组 b 的 0 行 0 列元素 ( )。 A) b[0][0] B) **p C) *p[0] D) *p 4. 设有说明 int (*ptr)[M];其中的标识符 ptr 是 ( )。 A) M 个指向整型变量的指针 B) 指向 M 个整型变量的函数指针 C) 一个指向 M 个整型元素的一维数组的指针 D) 具有 M 个指针元素的一维指针数组,每个元素都只能指向整型变量 二、填空题 1. 已知:下面程序段中第一个 printf 语句的输出是 200,则第二个 printf 语句的输出 是 ,第三个 printf 语句输出是 。 int a[3][4],*p=a; printf("%d",a); printf("%d",p);
第二部分¢语言程序设计同步训练 printf("sd",p+1); 2.已知nta[23]={12,34,56},*p=&a则表示元素ao0的方法有指针法: 数组名法 ,*(p+1)的值为 三、阅读程序写出运行结果 1. maino inta[2][3]={0,1,2,3,4,5},*p1,*p2 p2=&a[0][0] printf("%d, d\n",pl, p2) printf("旨d,器d\n”,*p1,*p2) printf("bd, d\n",pl+1, p2+1)i printf("d,号d\n",*(P1+1),*(p2+1)); 假设数组a的首地址为3000,则运行结果为 能力提高(B) 、选择题 1.已知 Int 1.x[3J[4则不能把xl值赋给变量i的语句是 A)i=*(*(x+1)+1) B)i=x[l]1]C)=*(*(x+1)D)i=*(x[1+1) 2.已知 static int a[2J[3]={2,4.6.8,10,12};正确表示数组元素地址的是() A)°(a+1) 3)*a[1+2)C)a[l]+3 D)a[0JIoJ 、阅读程序写出运行结果 maI inta[2][3]={{1,2,3},{4,5,6}} int m, *ptr ptr=&a[o] [ol =(*ptr)*(*(ptr+2))*(*(ptr+4)); printf("d\n", m) 运行结果: inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,13} int (*ptr)[4] ptr=ai for(i=0;i<3;i++) sum+=*(*(ptx+1)+j) printf("ga\n", sum) 运行结果 三、程序填空 1.下面程序通过指向整型的指针将数组叫[3][4的内容按3行*4列的格式输出,请给
第二部分 C 语言程序设计同步训练 ·239· ·239· printf("%d",p+1); 2. 已知;int a[2][3]={1,2,3,4,5,6},*p=&a[0][0];则表示元素a[0][0]的方法有指针法: , 数组名法: ,*(p+1)的值为 。 三、阅读程序写出运行结果 1. main() { int a[2][3]={0,1,2,3,4,5},*p1,*p2; p1=a; p2=&a[0][0]; printf("%d,%d\n",p1,p2); printf("%d,%d\n",*p1,*p2); printf("%d,%d\n",p1+1,p2+1); printf("%d,%d\n",*(p1+1),*(p2+1)); } 假设数组 a 的首地址为 3000,则运行结果为: 能力提高(B) 一、选择题 1. 已知:int i,x[3][4];则不能把 x[1][1]的值赋给变量 i 的语句是 ( )。 A) i=*(*(x+1)+1) B) i=x[1][1] C) i=*(*(x+1)) D) i=*(x[1]+1) 2. 已知:static int a[2][3]={2,4,6,8,10,12};正确表示数组元素地址的是( )。 A) *(a+1) B) *(a[1]+2) C) a[1]+3 D) a[0][0] 二、阅读程序写出运行结果 1. main() { int a[2][3]={{1,2,3},{4,5,6}}; int m,*ptr; ptr=&a[0][0]; m=(*ptr)*(*(ptr+2))*(*(ptr+4)); printf("%d\n",m); } 运行结果:_____________________。 2. main() { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,13}; int (*ptr)[4]; int sum=0,i,j; ptr=a; for (i=0;i<3;i++) for (j=0;j<2;j++) sum+=*(*(ptr+i)+j); printf("%d\n",sum); } 运行结果:_____________________。 三、程序填空 1. 下面程序通过指向整型的指针将数组 a[3][4]的内容按 3 行*4 列的格式输出,请给