1.声明:
进行声明时一定要注意变量先与谁结合,如上例中:若先与指针标识符*先结合则说明主体为指针 ,若先与[]结合则说明主体时数组。
2.解引用问题:
#include<stdio.h>
int main(void)
{
int temp[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &temp;//此处的数组指针p代表整个一维数组的地址
printf("addr of &p : %p\n", &p); //数组指针的地址
printf("addr of p : %p\n", p); //一维数组temp的地址
printf("addr of *p : %p\n", *p); //一维数组temp首元素的地址
printf("addr of **p : %d\n", **p); //一维数组temp首元素的数值
return 0;
}
3.跨度问题:
#include<stdio.h>
int main(void)
{
int temp[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &temp;
for(int i = 0; i < 2; i++)
{
printf("%p\n", *(p + i)); //运行可知跨度为20个字节
}
for(int i = 0; i < 2; i++)
{
printf("%p\n", *p + i); //运行可知跨度为4个字节
}
return 0;
}
(*p+i):
此处的p代表整个一维数组的地址,对其解引用(*p)即为一维数组首元素的地址,而此处定义的首元素类型为int型,故跨度为4个字节。
(p+i):
此处的p代表整个一维数组的地址,故其跨度为整个一维数组,此处定义的一维数组有5个int型数据,故跨度为20个字节。
解决跨度问题重点在于是否能够正确理解变量名的意义,例如上面声明的数组指针变量p则代表整个一维数组的地址,而对于一维数组,其数组名则代表其首元素(即一个单一的数据,如int,double,char型数据等等)的地址,(*p+i)的跨度会根据首元素的类型发生变化,而对于二维数组,其数组名同样是代表其首元素的地址,但其首元素并非单一的一个数据,而是一个一维数组。