第二部分¢语言程序设计同步训练 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<10;i++) scanf("暑d",&a[i]); for(;p<a+10;p++) printf ("gd",*p)i 执行程序,输入:0123456789 运行结果 ma int a[10],*p p=&a[0] for(;p<a+10;p++) scanf("告d",p); for (p=a+9; p>=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<10; i++) scanf("%d",&a[i]); for (;p<a+10;p++) printf("%d",*p); } 执行程序,输入:0 1 2 3 4 5 6 7 8 9 运行结果:_____________________。 2. main() { int a[10],*p; p=&a[0]; for (;p<a+10;p++) scanf("%d",p); p=a; for (p=a+9; p>=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<=k<6,则正确表示数组元素地址的语句是()。 intx={1,3.5,7,9,11},*ptr=xk )&ptr C)&ptr[k] 5.已知nta={1,2,3,4.56},*p=a则值为3的表达式是() A)p+=2,*(p+)B)p+=2,*++pC)p+=3,*p++D)p+=2,++*p 6.若第一个 printf语句的输出为194,则第二个pntf语句的输出为() int a[10],*p= printf("%x",p)i printf("x",p+9) A)203 B)212 D)19d 阅读程序写出运行结果 1. include <stdio h> main() p=&a[0] ntf("*p=号d,x=旨d,y=dln",*p,x,y); 行结果 2. #include <stdio h> ]={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<=k<6,则正确表示数组元素地址的语句是( )。 int x[]={1,3,5,7,9,11},*ptr=x,k; A) x++ B) &ptr C) &ptr[k] D) &(x+1) 5. 已知:int a[]={1,2,3,4,5,6},*p=a;则值为 3 的表达式是 ( )。 A) p+=2,*(p++) B) p+=2,*++p C) p+=3,*p++ D) p+=2,++*p 6. 若第一个 printf 语句的输出为 194,则第二个 printf 语句的输出为( )。 int a[10],*p=a; printf("%x",p); printf("%x",p+9); A) 203 B) 212 C) 1a6 D) 19d 二、阅读程序写出运行结果 1. # include <stdio.h> 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 <stdio.h> 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);