【C语言笔试复习】指针数组和数组指针

这周开始做C语言笔试卷,什么嘛!考的都是概念,各种细节,虽然貌似书上都能找到,但我还真不清楚...顿时又有一种我C语言学的好渣的感觉 T_T

好了,说下在【上机实验蓝皮书背后,综合测试题二】中难到的2道题,这两道题使得你对【指针数组】和【数组指针】的区别更加清晰。

【例题1】

有以下程序:

#include 

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 

int main()
{
    char *s[] = {"one", "two", "three"}; // s是一个指针数组,元素是三个指向字符串常量的指针
    char *p = s[1];              // p是一个指向字符串的指针变量
    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】




你可能感兴趣的:(c,指针,C)