指针数组的简单理解

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

 

posted on 2018-11-09 19:44  王朝马汉  阅读(404)  评论(0编辑  收藏  举报

导航