二级C语言试题讲解
认证攻关
指针(2)
一、理论讲解
1.引用数组元素的方法
在引入指针概念后数组元素的使用除了可以用下标法外,还可以用指针法。即通过数组元素的指针找到所需要的数组元素。
⑴ 下标法
在定义了int a[10]; 后若引用该数组中的某个元素可以用a[i]的形式,a[i]元素的地址通过&a[i]和(a+i)可以求得,实际上[]是个变址运算符,称为下标运算符。
⑵ 指针法
在定义了int a[10],*p=a; 后指针变量p就指向了数组的首地址,所以p=a,因此,表示一维数组的第i个元素可用p[i]、*(a+i)、*(p+i)、*p++表示,而第i个元素的地址可用a+i 、p+i表示。
2.使用数组指针注意的问题
设int a[10],*p=a;
⑴ p+i或a+i与&a[i]等价
p+i和a+i就是a[i]的地址。
⑵ *(a+i)、*(p+i)和p[i]都可用来表示数组元素
表达式*(p+i)或*(a+i)是对一个地址量执行*运算,得到的是地址p+i或a+i中的数据。
⑶ 指针与数组名的区别
指针和数组名在本质上是不同的,指针是地址变量,数组名是地址常量。因此,对指针变量p和数组名a来说,p++是正确的,而a++是错误的。
二、典型试题解析
例1:写出程序的运行结果,设第一个Printf语句的输出结果为ffd0。
main()
{ int a={2,4,6,8,10,12},*p=a,*q=a+5;
printf("%x\n",p); 运行结果:ffd0
printf("%d,%d\n",*++p,*q--); 4,12
printf("%x,%x\n",p++,--q); ffd2,ffd6
printf("%d,%d\n",*p,*q); 6,8
}
例题分析:在定义中*p=a是将数组a的首地址作为初值赋给指针变量p,所以指针变量p指向了数组元素a[0],而*q=a+5是将数组元素a[5]的地址赋给指针变量q。已知第一个Printf语句的输出结果为ffd0。则说明a[0]的地址为ffd0,由于整形数组的每个元素占2字节空间,所以q所指向的a[5]的地址为ffda。第二个Printf语句的输出项为*++p和*q--,根据运算规则*++p是先将指针加1指向了a[1],再输出其值则为4,而*q--是先输出其目标变量的值12,然后指针减1指向了a[4],即ffd8。第三个Printf语句中对p++是先输出指针变量p的值ffd2,然后指针加1指向了a[2],而对--q则是先将指针减1指向了a[3],再输出其值ffd6。最后一个printf语句是输出当前指针变量p和q所指单元内容,即6,8。
考察重点:此题要求考生掌握指针变量中指针与数组之间的关系。
例2:下面程序段的运行结果是。答案:C
main()
{ int i,x[3][3]={9,8,7,6,5,4,3,2,1},*p=&x[1][1];
for(i=0;i<=4;i+=2) printf("%d ",p[i]);
}
A. 6 4 2 B. 5 3 C. 5 3 1 D. 6 4
例题分析:由定义中的*p=& x[1][1],可知p中存放了变量x[1][1]的地址。在循环体中当i=0时,p[0]的地址就是元素x[1][1]的地址,值为5。当i=2时,p[2]的地址就是元素x[2][0]的地址,值为3。当i=4时,p[4]的地址就是元素x[2][2]的地址,值为1。所以选C。
考察重点:该题主要是让考生弄清楚当二维数组的地址赋给指针变量后,可以利用指针变量将二维数组降维成一维数组的使用方法,并要掌握二维数组在内存中的顺序存储方式。
例3:在以下程序段中选择放在需要补充的程序段处可以满足运行结果是:program C。答案:A、B、C
main()
{ char a[10]="program C",b[10],*pa=a,*pb=b;
需要补充的程序段
printf("%s\n",b);
}
A.while((*pb=*pa)!='\0') {pa++;pb++;}
B. while(*pb=*pa) {pa++;pb++;}
C. while(*pb++=*pa++); D. while(*++pb=*++pa);
例题分析:从定义可知pa,pb分别指向数组a和b,根据输出结果可以知道需要补充的程序段要完成将a数组的字符串赋给b数组,才能使输出b数组的内容为program C。
在选项A和B的程序段中循环条件是先将指针pa所指元素a[0]赋给指针pb所指元素b[0],然后再判断所赋值是否等于字符串的结束符。若不等于字符串结束符则执行循环体将指针pa和pb加1指向下一个元素,再复制并判断,重复此过程,直到所赋值为结束符,退出循环,输出b数组的内容。
在选项C的程序段中也和选项A和B的程序段相同,先复制再判断,所不同的是循环体为空,指针pa和pb加1指向下一个元素是判断后在循环条件中完成的。可以输出program C。
在选项D的程序段中,因为是先将指针pa和pb加1指向下一个元素a[1]和b[1],所以第一个字符没有完成复制,输出b数组的内容不是program C。
考察重点:该例题主要是让考生弄清楚如何用字符指针和字符数组结合字符串的结束符对字符串进行处理的方法。