c++二维字符数组_C指针和字符串数组

题目

下面这段代码输出什么?先别急着百度,先想先这个代码可能输出什么,一不小心你就失去了自主学习的机会了。

#include#includeint main(){    char *a[] = { "work", "at", "alibaba" };    char **pa = a;    pa++;    printf("%s\n", *pa);    system("pause");    return 0;}

我们分析分析

a是一个数组,这个数组存的类型是 char * 类型,所以是这个样子的。49b46d9a8b263651b24a72c0a2553ed9.pnge378b60bbdcee478913b5878417dde3b.png

pa 是一个二级指针变量,这个指针变量的初始化地址的 a 的首元素的地址,所以pa的值和 &a[0]是一样的。7da2da45b5d7f68ddc0bea48dc3e2769.png

pa 是一个指针变量,pa 初始化的是 &a[0] ,也就是这个数组的首地址。感觉有人还不是很理解这个东西,pa 存在的是 a[0] 的地址,所以通过 * 这个钥匙就可以拿到 pa里面的东西,a[0] 里面的东西是什么类型的?看 a的定义我们可以知道,里面存的是 char * 字符串。

a90b2b76ff8354eb18291e822b5bd547.png

print("%s\n",*pa);

应该输出的是 “work”字符串。但是呢,题目里面对 pa进行了自加运算,那 pa 存的地址就不是这个了。这个 pa++ 我们应该如何去理解,或者它本来就应该进行什么运算呢?

pa++

pa 是什么?pa 是一个指针变量。pa 的类型是什么?pa 的类型是 char ** 类型,就是二级指针变量,也就是他存的是指针变量的地址。所以正常是这样使用

#include#includeint main(){    char *p = "weiqifa";    char **pa = &p;    printf("%s\n",*pa);    return 0;}

回到上面的代码,pa既然是指针变量,那么pa++就是指向这个指针变量的下一个元素的地址

举个例子说指针

#include#includeint main(){    char a = 'p';    char *p = &a;    char **p1 = &p;    char ***p2 = &p1;    char ****p3 = &p2;    char *****p4 = &p3;    char ******p5 = &p4;    *&a = '3';    printf("%c %c %c\n",***p2,******p5,a);    system("pause");    return 0;}

414b3fd194c6e8a64e2b17ef84f93bab.png

•a是一个别名,这个别名代表一个地址,这个地址里面存的是一个字符 ‘p’•p因为它的前面有一个 * 所以 p是一个指针变量,它存的是东西是地址,它存的这个地址里面存的是一个 char 。•p1 因为它前面有一个 * 所以 p1 是一个指针变量,它存的是东西是地址,它存的这个地址里面存的是一个char *•p2 因为它前面有一个 * 所以 p2 是一个指针变量,它存的是东西是地址,它存的这个地址里面存的是一个char * *•p3 因为它前面有一个 * 所以 p3 是一个指针变量,它存的是东西是地址,它存的这个地址里面存的是一个char * * *•p4 因为它前面有一个 * 所以 p4 是一个指针变量,它存的是东西是地址,它存的这个地址里面存的是一个char * * * *•p5 因为它前面有一个 * 所以 p5 是一个指针变量,它存的是东西是地址,它存的这个地址里面存的是一个char * * * * *

我们分析下 char * * * * * 这个是什么?这个是一个类型,也可以是说明属性,在汉语里面,可以理解为形容词,形容词后面如果没有名词,是没有意义的。

就比如说 「我非常」,主谓宾,没有后面的一个词来辅助,它没有意义。

char * * * * * 也是一样,它后面需要加一个东西,应该是后面需要加一个地址,指明这个地址是干什么的。

比如 char * * * * * pt

问:

上面两段代码都输出什么了?

c6cf0cead9657c7a62ca1a796c0ce0a9.png

87ac84f0842645c8bea5c7a86f6a9ac0.png

扫码或长按关注

回复「 加群 」进入技术群聊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值