C语言:字符串指针数组

C语言:字符串指针数组

C语言:字符串指针与字符串数组_srhqwe的博客-CSDN博客_c语言字符串指针和字符串数组

这个关于字符串指针的基础讲解,用于潜在了解字符串指针。

创建一个字符串指针:char* p = "hello world";那么char* 类型是必要的,那么我们可以知道char*[]这是char*类型的数组 ,如果加上变量名parr则就是:char * parr[]那么这就是一个数组,char类型的指针数组,里面存放的每个元素是char*,所以从p可以知道,每个元素可以是字符串,那么就是:

char* parr ={"good head","strength body","smooth foot"} ;

这样,parr就是一个字符串指针数组。

数组名=数组民[0]=数组首元素的地址。

那么数组首元素是char* 类型的,char*类型的地址就是char**是二级指针。

例题:

char* a[]是字符串指针数组,数组内每个元素类型是char*;

a是数组首元素的地址,是“work”的地址,而“work”是char*类型的一级指针,所以“work”的地址就是二级指针,所以放到char** pa这样的二级指针内:char** pa = a;

pa++,pa是二级指针,就是跳过一个char*类型的的大小,就是sizeof(char*),也就指向了“at”,

*pa是对pa解引用,得到了char*类型的“at”,这是字符串指针,指向的是首元素的地址,“a”的地址,再用printf通过%s打印(%s打印的是字符串),从"a"开始打印到“\0”时结束

所以结果是:at

再来一题:

c、cp和cpp分别是:一级指针、二级指针和三级指针,吸取上面的经验后,很轻易就就能看出,这是套娃,所以需要画图,来理解它们之间的关系:

有了示意图,就需要看看printf了,发现printf内部有很多操作符,因此这些操作符的优先级就很需要知道了,这里就不提了。下面会说到。

++的优先级比*的优先级高,所以这里会先++cpp。

得到了c+2的地址。

一个*得到了c+2,而c+2是c[2]的地址,两个*就得到了c[2],也就是“POINT”的首元素地址“P”。

通过%s打印就是"POINT"。

++比+优先级高,所以先++cpp,因为前面已经++过cpp了,此时再次++cpp,cpp的位置就到c+1,也就是c+1的地址。

*的优先级比+高,所以*++cpp就得到了c+1这个内容,也就是char* “NEW”的地址,

再--就得到了char* “ENTER”的地址,并且c+1这个地址就变成了c。

再*得到了“ENTER”的首元素地址,“E”的地址。

再+3得到了 “E”的地址。

此时通过%s打印的结果是:“ER”

[]的优先级是最高的,所以要先计算[-2],[-2]相当于*(cpp-2),所以得到了c+3的地址再解引用,得到了c+3这个内容,也就是char* "PORST"的指针。

*得到了char* "PORST"的内容,也就是"PORST"的首元素地址,”P“的地址

+3得到了”S“的地址,

此时通过%s打印的结果是:“ST”

[-1][-1]就相当于*(*(cpp-1)-1),里面一层得到了c+2的内容,也就是char* ”POINT“的指针,外面一层得到了char* ”NEW“的首元素地址,"N"的地址。

+1就得到了”E“的地址。

此时通过%s打印的结果是:“EW”

如果有错 ,希望纠错

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

srhqwe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值