int( * p ) () 和 int * p()区别
# int ( *p ) () 是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。
# int *p() 说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号
int * ( * ( * fp ) ( int ) ) [10] 和 int * ( * ( * array [5] ) () ) ()的含义
# fp 是一个指针,指向一个参数为int型的函数,返回值是一个指针,这个指针指向一个数组,这个数组中有十个元素,每个元素都是一个int型的指针
# array[5]是一个数组,数组中的每个元素都是一个指针,每个指针指向一个函数,这个函数的返回值为一个指针,每个指针指向一个函数,函数的返回值是int型的指针
表示形式 |
含义 |
&a |
指向二维数组的指针 |
a |
二维数组名,指向一维数组a[0],即第0行首地址 |
a[0] , *(a+0) , *a |
第0行第0列元素地址 |
a+1 , &a[1] |
第1行首地址 |
a[1] , *(a+1) |
第1行第0列元素地址 |
a[1]+2 , *(a+1)+2 , &a[1][2] |
第1行第2列元素地址 |
*(a[1]+2) , *(*(a+1)+2) , a[1][2] |
第1行第2列元素的值 |
# [ ] 有取值的含义
int main()
{
int a[3][4] = {{1, 2, 3, 4}, {3, 4, 5, 6}, {5, 6, 7, 8}};
int i;
int (*p)[4] = a, *q = a[0];
// int (*p)[4] = a 四个元素 每个元素 4 个字节,p+1 加 16 个字节
a 是数组名,a+1 是加一行,一行 16 个字节,所以这条语句合法
for(i = 0; i < 3; i++)
{
if(i == 0)
{
(*p)[i + i / 2] = *q + 1; // = (*p)[0] = a[0][0]
}
else
{
p++,++q;
}
}
for(i = 0; i < 3; i++)
{
printf("%d,", a[i][i]); //打印对角线上的内容
}
printf("%d, %d\n", *((int *)p), *q);
return 0;
}