前提:
数组指针是指针
指针数组是数组
示例:
int *p1[5];
和
int (*p1)[5];
前者为指针数组 后者为数组指针。
涉及运算符号优先级:数组下标[]比取值运算符*的优先级更高。自右向左结合。先结合数组下标[].
先谈指针数组:
int *p1[5];
指向整型数据的指针变量。0 1 2 3 4 (int *)
**结论:**指针数组是一个数组,每一个数组元素存放一个指针变量。
代码示例:
#include <stdio.h>
int main()
{
int a=1;
int b=2;
int c=3;
int d=4;
int e=5;
int *p1[5]={&a,&b,&c,&d,&e};
int i;
for(i=0;i<5;i++)
{
printf("%d\n",*p[i]);
}
return 0;
}
这一段与数组的输出循环体大致相似。
for(i=0;i<5;i++)
{
printf("%d\n",*p[i]);
}
只是数组名换成指针变量而已。所以指针数组依然是数组。
指针数组运用到字符串上相当便捷(可以不用二维数组)
初始化(字符串打双引号)之后输出注意字符串输出给地址即可 不用打 * 这个取值符号直接写为p[i]
数组指针
int (*p1)[5];
指针变量p1指向整个数组,0 1 2 3 4(int),且数据类型为整型数据。
结论:数组指针是一个指针,它指向的是一个数组。
代码示例:
#include <stdio.h>
int main()
{
int temp[5]={1,2,3,4,5};
int (*p)[5]=&temp;
int i;
for(i=0;i<5;i++)
{
printf("%d\n",*(*p+i));
}
return 0;
}
切记不可这样初始化:
int (*p)[5]={1,2,3,4,5};
编译器不会报错但输出内容是错的。
数组指针也是如此,定义为char时输出不加*