指针数组的简单理解

Posted wangchaomahan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针数组的简单理解相关的知识,希望对你有一定的参考价值。

 1 #include <stdio.h>
 2 /*
 3 研究类型,步长,数组名和二级指针的关系
 4 */
 5 int main(void)
 6 {
 7     char *p[4] = {"1234","sq34","d234","4234"};
 8     //万变不离其中:数组名 == 首元素的地址
 9     //1.整体研究
10     printf("sizeof(p) = %d
",sizeof(p));//p是数组名,作为整体,p返回的是数组的长度。16字节
11     printf("&p = %p	&p+1 = %p
",&p,&p+1);//对数组名引用,它的类型发生变化由char ** 变成了char **[4]类型,所以+1是加了16字节
12     printf("sizeof(&p) = %d	sizeof(char *[4]) = %d
",sizeof(&p),sizeof(char **[4]));
13     printf("p = %p	p+1 = %p
",p,p+1);
14     printf("*p = %s	sizeof(*p) = %d
",*p,sizeof(*p));//指针数组里面的每个元素都是个指针,所以每个元素占用4个字节
15     printf("*p = %s	**p = %c
",*p,**p);//*p代表字符串的首地址,**p就代表字符串的第一个字符
16     //指针数组名和二级指针是等价的
17     char **q = p;//能这样写的原因:p = &p[0]  而p[0]是个指针,是char *类型,所以 p是 char **类型,是指向指针的指针,是个二级指针
18     printf("*q = %s
",*q);
19     //2.单独元素研究
20     printf("p[0] = %s,sizeof(p[0]) = %d
",p[0],sizeof(p[0]));//p[0]代表数组的第一个元素,而第一个元素是一个指向data区ro段的指针。
21     printf("*p[0] = %c	p[0][0] = %c
",*p[0],p[0][0]);//p[0]代表第一个元素,而第一个元素是一个字符串(可以理解成一个字符数组)
22                                                        //所以p[0]就是字符串的首地址,*p[0]就代表第一个字符
23     printf("*(p[0]+1) = %c
",*(p[0]+1));//p[0]代表第一个字符串的首地址,地位相当于一维数组名,所以+1加的是1个字节。下面测试
24     printf("p[0] = %p	p[0]+1 = %p
",p[0],p[0]+1);//测试
25     //整体访问
26     for(int i = 0;i<4;i++)
27     {
28         printf("%s
",p[i]);
29     }
30     //单独访问一个字符串中的元素
31     for(int j = 0;j<sizeof(p[0]);j++)
32     {
33         printf("%c	",*(p[0]+j));//或者:printf("%c	",*(*p+j));
34     }
35     putchar(10);
36     /*
37     总结:1.指针数组本质上就是一个数组,只不过这个数组里面放的都是指针而已。
38           2.二级指针和指针数组名是等价的关系。
39     */
40     
41     return 0;
42 }

 

以上是关于指针数组的简单理解的主要内容,如果未能解决你的问题,请参考以下文章

图解多级指针与“多维”数组

深刻理解数组指针(就是一个指针)

让学指针变得更简单

当指针指向数组时,为啥 operator(*) 的值不起作用?

数组分配与访问

C 语言数组 ( 多维数组本质 | 步长角度 理解 多维数组本质 )