a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
数组名的指针,即数组首元素地址的指针。即是指向数组的指针。
例:int (*p)[10]; p即为指向数组的指针,又称数组指针。
目录
1数组指针与指针数组
指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。
数组指针的使用在某些情况下与指针数组很相似,要注意区别。
2二维数组指针
为了能更好地理解数组指针,与普通指针及二级指针的区别,下面举例说明一下。
例如:{int a[4][5];int (*p)[5]=a;}这里a是个二维数组的数组名,相当于一个二级指针常量;
p是一个指针变量,它指向包含5个int元素的一维数组,
此时p的增量
以它所指向的
一维数组长度为单位;
*p+i是二维数组a[0][i]的地址;
*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。
//(*p)[5]其中的5换成其他的数字在vc++6.0环境中都无法通过编译
(*p)[5]其中的5在上述例子中没有表示任何意思你可以换成除0以外的整数,[5]的作用就是帮助你记忆说你所指向的一维数组的长度。(不过除了与定义的二维数组的长度一致的不会警告之外 )其他的数会警告但是不影响结果。
3举例
数组指针:
char c[][3] = {"妹", "妹", "你", "坐", "船", "头"};
char (*p)[3];
int i;
char c[][3] = {"妹", "妹", "你", "坐", "船", "头"};
char (*p)[3];
int i;
p = c;
for(i=0; i<6; i++)
{
printf("%s, ", *(p+i)); //*(p++);
}
for(i=0; i<6; i++)
{
printf("%s, ", *(p+i)); //*(p++);
}
printf("\n"); //p=c;/p--;
for(i=5; i>=0; i--)
{
printf("%s\n", *(p+i)); //*p--;/*--p;
}
指针数组:
int i;
char *pch[6] = {"妹","妹","你","坐","船","头"}; //这种写法不提倡,应该先声明一个数组,再把地址给指针,
for(i=0;i<6;i++) //否则很危险;
{
printf("%s, ",*(pch+i));
}
printf("\n");
for(i=5; i>=0; i--)
{
printf("%s\n",*(pch+i));
}
char *pch[6] = {"妹","妹","你","坐","船","头"}; //这种写法不提倡,应该先声明一个数组,再把地址给指针,
for(i=0;i<6;i++) //否则很危险;
{
printf("%s, ",*(pch+i));
}
printf("\n");
for(i=5; i>=0; i--)
{
printf("%s\n",*(pch+i));
}