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 }