#数组指针与指针数组
函数指针和指针数组可以通过运算符的优先级和结合性分辨。
intp1[]从优先级上来看p1被定义为5个元素的数组又因为所以是指向整型变量的指针。其中元素的类型为int*。
结论:指针数组是一个数组,每个数组元素存放一个指针变量。
因为int(*p)[]从优先级上看()和[]同级所以此时就是先来后到的问题了。他们结合性都是从左到右,所以p2先被定义为一个指针变量,它后边还跟着[] 。所以p2指向的就是这个数组。
结论:数组指针是一个指针,它指向的是一个数组。
##指针数组
由于指针数组存放的是一个指针变量,所以在某些程度上可以替换2维数组,从而使程序更加简洁,列如:
#include <stdio.h>
int main()
{
char *p1[3]={
"hello",
"pretty",
"word"
};
int i;
for(i = 0; i < 3; i++)
{
printf("%s\n",p1[i]);
}
return 0;
}
这样打印是不是比二位数组要更容易理解呢?
##数组指针
在对数组指针初始化的时候,千万不要掉进陷阱。列如一下的代码
#include <stdio.h>
int main()
{
int(*p1)[5] = {1, 2, 3, 4, 5};
int i;
for(i = 0; i < 5; i++)
{
printf("%d\n",*(p1 + i));
}
return 0;
}
像这样的代码,编译器会提醒有可能有问题,然后打印奇怪的数值。
这是一个经典的错误,编译器会提示说这里存在一个整数赋值给指针变量的问题,其实p1说到底它还是一个指针,所以需要给他一个地址。
那么修改一下代码。
#include <stdio.h>
int main()
{
int temp[5] = {1, 2, 3, 4, 5};
int(*p1)[5] = temp;
int i;
for(i = 0; i < 5; i++)
{
printf("%d\n",*(p1 + i));
}
return 0;
}
但是这样系统又会报错这是为什么呢?
之前学习的数组和指针的关系却明明可以这样表示,到这为什么就不行了呢?
这是因为之前的指针指向的是第一个元素的地址也就是上面代码中的(int(*p1)[5] = temp;)这里的temp指向的数组第一个元素的地址,又因为数组中的元素都是一个个挨着放的,所以就可以通过第一个元素的地址来访问后边所有的元素。
而此时的int(*p1)[5] 需要的是整数数组的地址也就是&teap。
#include <stdio.h>
int main()
{
int temp[5] = {1, 2, 3, 4, 5};
int(*p1)[5] = &temp;
int i;
for(i = 0; i < 5; i++)
{
printf("%d\n",*(*p1 + i));
}
return 0;
修改成这样就可以了,但是在打印这个值时又需要改变。
*(*p1 + i)通过定义可知p1 = &temp;
所以这里的*p1就等于*&temp即去出这个数组第一个的地址,然后再通过+i来依次访问每个元素的地址最后用*取出里面的值。