数组指针与指针数组有时候不好区分,越想越乱,所以写一篇文章来弄清他们的本质,只要知道了本质,那么用起来就很轻松了
指针数组: 是一个数组,元素为指针;
定义
char* a[4]={"aaaaa","bbbbb","ccccc","ddddd"};
a[i]存储的是字符串的首地址,例如a[1]存储的是字符串“bbbbb”的首地址
printf("%s"a[1]); //输出bbbbb
printf("%d,%d"a[0],a[1]);//输出的是两个数字,相差4,(内存地址)
可以理解成这样
char* a0="aaaaa";
char* a1="bbbbb";
char* a2="ccccc";
char* a[3];
a[0]=a0;
a[1]=a1;
a[2]=a2;
数组指针: 本质是指针
定义:
char (*p)[4]; //必须这样声明,有的地方说数字可以任意写,只会警告,不会报错,反正我的编译器是报错。
char a[4]="123";
p=&a; //指向数组a的首地址;
printf("%s",*p); //输出123
printf("%c",(*p)[1]); //输出2与 ("%c",a[1])相同;
所以我们可以把
*p看作数组名a,这不是和一般的指针一样吗?
注意:符号[]比符号*的优先级要高,所以要加括号————(*p)[i];
(*p)[i]这种写法并不规范,这样写知识为了让人明白数组指针的本质。