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

这周开始做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】




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值