若有定义语句:char s[3][10],(*k)[3],*p; p=s[0]为什么是对的? s是二维数组,怎么写成了一维数组!!!

如题所述

C语言没有多维数组,只有多个一维数组的嵌套。
举个例子给你讲吧
a[3][3]= {1,2,3
4,5,6
7,8,9 }
其实是3个一维数组a[0] = {1,2,3};a[1]= {4,5,6};a[2]={7,8,9}组成的;
a表示数组名,也代表数组首地址。此首地址并非a[0][0]元素的地址,而是a[0]这个数组的地址(虽然具体数值一样,但意义不同);所以对于2为数组a[3][3]; a+1 表示的是一维数组a[1]的地址,
*(a+1)表示的是数组a[1]中第一个元素的地址,所以*(*(a+1)+2)表示数组a[1]中第3个元素的值也就相当于a[1][2],其值为6;
(*p)[3] = a; 表示p是一个指向一维数组的指针。 这时p指向第一个一维数组也就是 1,2,3这一行。 p+1表示指针指向了第二个一维数组也就是4,5,6;
用法上指针p和数组名a基本一样;
以后遇到a[m][n]不要再想象成二维数组,就想成m个1维数组编号从a[0]到a[m-1]每个数组里存了n个元素
不明白再问
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-18
直接定义的二维数组,实际上是一个m*n的连续空间,就是一维的,是逻辑上的二维。而且p=s[0]实际是s的三个维的一个,就是第一行的地址。p=s[1]是第二行的地址,这样,p[3]就相当于s[0][3]了。

二维数组写成一维是地址,写成二维是元素。s[0] 相当于 &s[0][0].
第2个回答  推荐于2017-12-22
s是二维数组,s[0]既能表示“一维数组”,也能表示一维数组的首地址。
在这里,即是把一维数组的首地址,赋值给指针变量p。本回答被网友采纳
相似回答