c语言的问题

#include<stdio.h>
main()
{
int a[ ][4] ={1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23} ;
int (*p) [4], i = 2, j = 1 ;
p = a ;
printf ( "%d\n" ,*(*( p + i ) + j ) ) ;
}
int a[ ][4]和 int (*p) [4]都什么意思呀?为什么前面是二维的 但是却空了一个,后面的指针却是一维的

因为int a[ ][4] ={1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23} ;
进行了初始化,后面共有12个元素,所以int a[][4]等效于int a[3][4],是一个二维数组。

a是数组名,也是那个数组的首地址;而(* p)表示p是一个指针,
所以p=a就是把a二维数组的首地址保存到p中,
从而,*(*( p + i ) + j ) )等效于,*(*( p + 2) + 1) )=a[2][1],

[ 0] [1] [ 2] [3]
[0] 1 3 5 7
行[1] 9 11 13 15
[2] 17 19 21 23

所以输出答案就是19啦
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-23
这道问题在谭浩强c语言程序设计第三版的p248面解释得很清楚。
int a[][4]是一个二维数组,二维数组的一个括号表示有多少行,这个可以省略,第二个括号表示有多少列,这个不能省略。
int (*p)[4] 表示p一个指针变量,它指向包含4个整型元素的一维数组。
相似回答