这周开始做C语言笔试卷,什么嘛!考的都是概念,各种细节,虽然貌似书上都能找到,但我还真不清楚...顿时又有一种我C语言学的好渣的感觉 T_T
好了,说下在【上机实验蓝皮书背后,综合测试题二】中难到的2道题,这两道题使得你对【指针数组】和【数组指针】的区别更加清晰。
【例题1】
有以下程序:
#include <stdio.h>
int main()
{
char *s[] = {"one", "two", "three"}, *p;
p = s[1];
printf("%c, %s\n",*(p+1), s[0]);
return 0;
}
执行后的结果是_______。
A. n, two B. w, one C. t, one D. o, two
第一次我选了 C,因为我以为 (p+1) 是指向 "three“ 的。这是对指针 p 类型的理解错误。
正确答案是 B,因为:
#include <stdio.h>
int main()
{
char *s[] = {"one", "two", "three"}; // s是一个指针数组,元素是三个指向字符串常量的指针
char *p = s[1]; // p是一个指向字符串的指针变量
</pre><pre name="code" class="cpp"> printf("%c, %s\n",*(p+1), s[0]); // (p+1)是p的地址加一个字符内存的大小,从指向t变成指向w
return 0;
}
所以,平时我们说的指向字符串的指针,其实都是指向一个字符,所以对它进行位移运算时,加减都是1。
另外,如果你把
printf("%c, %s\n",*(p+1), s[0]);
改成
printf("%s, %s\n",*(p+1), s[0]);
输出就会是:wo,one。
因为平时我们输出字符串的时候,实际上都是把字符串的首地址传给 printf( ) 函数,它通过末尾的 '\n',来判断是否结束。
【例题2】