C语言:字符串指针数组
C语言:字符串指针与字符串数组_srhqwe的博客-CSDN博客_c语言字符串指针和字符串数组
这个关于字符串指针的基础讲解,用于潜在了解字符串指针。
![](https://i-blog.csdnimg.cn/blog_migrate/3513df58f0629a37b21ed80e22c4626d.png)
创建一个字符串指针: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**是二级指针。
![](https://i-blog.csdnimg.cn/blog_migrate/5ccb625b7a43dab93e39f7e71f11f0ae.png)
例题:
![](https://i-blog.csdnimg.cn/blog_migrate/a1ecd3cc28e065c1a526f633483db949.png)
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
再来一题:
![](https://i-blog.csdnimg.cn/blog_migrate/d1b9a88c1238cdc3ebd0b1132598d5fb.png)
c、cp和cpp分别是:一级指针、二级指针和三级指针,吸取上面的经验后,很轻易就就能看出,这是套娃,所以需要画图,来理解它们之间的关系:
![](https://i-blog.csdnimg.cn/blog_migrate/f60b8d8da4b2a00b7a976c9fdeb7cb42.png)
有了示意图,就需要看看printf了,发现printf内部有很多操作符,因此这些操作符的优先级就很需要知道了,这里就不提了。下面会说到。
![](https://i-blog.csdnimg.cn/blog_migrate/28fb5872daf164110291584bb6db7b18.png)
++的优先级比*的优先级高,所以这里会先++cpp。
得到了c+2的地址。
一个*得到了c+2,而c+2是c[2]的地址,两个*就得到了c[2],也就是“POINT”的首元素地址“P”。
通过%s打印就是"POINT"。
![](https://i-blog.csdnimg.cn/blog_migrate/590f842e6f668bf71f05301c9d82d86f.png)
++比+优先级高,所以先++cpp,因为前面已经++过cpp了,此时再次++cpp,cpp的位置就到c+1,也就是c+1的地址。
*的优先级比+高,所以*++cpp就得到了c+1这个内容,也就是char* “NEW”的地址,
再--就得到了char* “ENTER”的地址,并且c+1这个地址就变成了c。
再*得到了“ENTER”的首元素地址,“E”的地址。
再+3得到了 “E”的地址。
此时通过%s打印的结果是:“ER”
![](https://i-blog.csdnimg.cn/blog_migrate/ab32b627e7b2439a8bbd65ba6af95ade.png)
[]的优先级是最高的,所以要先计算[-2],[-2]相当于*(cpp-2),所以得到了c+3的地址再解引用,得到了c+3这个内容,也就是char* "PORST"的指针。
*得到了char* "PORST"的内容,也就是"PORST"的首元素地址,”P“的地址
+3得到了”S“的地址,
此时通过%s打印的结果是:“ST”
![](https://i-blog.csdnimg.cn/blog_migrate/41ac5b1055a6e509c75452424b1bb3a4.png)
[-1][-1]就相当于*(*(cpp-1)-1),里面一层得到了c+2的内容,也就是char* ”POINT“的指针,外面一层得到了char* ”NEW“的首元素地址,"N"的地址。
+1就得到了”E“的地址。
此时通过%s打印的结果是:“EW”
如果有错 ,希望纠错