C语言指针指向一维数组与二维数组?

哪位知道,C语言指针指向一维数组与二维数组??

请问高人,想定义一个指针指向一个一维/二维数组,

(一)
double *a;
double data[3]= {1,2,3};
a = data;

编译正确

(二)
double *a;
double data[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
a = data;

编译出错:
error #515: a value of type "double (*)[3]" cannot be assigned to an entity of type "double *"

(三)
double data[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
double *a = data;

编译正确

请问:
(1)(一)中指向一维数组对了,(二)中指向二维数组为什么不对?
(2)(三)和(二)不是一个意思么?为什么一个对一个错?
最新回答
敷衍丶换来无言的结局ゝ

2024-06-04 05:33:37

3和2是一样的,也是会报错的。

可以使用行指针double (*p)[3]=data;指向数组第0行,也就是我们平常理解的第一行。

访问方式,假设data是i行j列,*(*(p+i)+j)就是第i行j列的元素值,也就是data[i][j]的值。

也可以使用列指针double *p = data[0]指向第0行0列,访问方式如下:

追问

不好意思:

“double (*p)[3]=data;指向数组第0行”的说法好像不对?

程序如下:

double data[2][3] = {1, 2, 3, 11, 22, 33};

 double (*p)[3] = data;

将(*a)[3]添加Add Watch运行结果:

(*p)[3]为什么指向了第二行第一列元素11?

且根据“double (*p)[3]=data”这一句的等号左边的意思应当是:y指针*p定义的长度为3?那怎么会有(*p)[3]、(*p)[4]、(*p)[5]?

追答
因为内存是连续分配的,而不是说二维数组就给你分配成二维数组的样子
纯家小可爱

2024-06-04 01:01:49

(三)应该报错的:error: cannot convert ‘double (*)[3]’ to ‘double*’ in initialization.

先回答(2):其实(二)和(三)一个意思,都不正确。(三)在你那里不报错估计是编译器环境的原因。

对于问题(1),在于能否正确理解二维数组名的含义。

二维数组名data表示第0行的地址;*data表示data[0][0]的地址;而**data才表示data[0][0]的值。


可以看一下该博文: