
C语言中指针引用二维数组元素问题
假设a是一个3行4列的二维数组,请问为什么a[0]与*(a+0)是等价的,我的理解是二维数组名a既然是该数组首元素的地址,那么(a+0)也是一个地址,“*(a+0)”就是...
假设a是一个3行4列的二维数组,请问为什么a[0]与*(a+0)是等价的,
我的理解是二维数组名a既然是该数组首元素的地址,那么(a+0)也是一个地址,“*(a+0)”就是指向“(a+0)”这个地址的内容(即首个元素值)。
a[0]与*(a+0),一个元素地址和一个元素内容又如何能等价~~
请懂C语言的人帮忙解答,指出我的思维误区。我都为这问题冥思苦想好几天了,每次拿起书本就把该节内容看一边,就是不理解这了。 展开
我的理解是二维数组名a既然是该数组首元素的地址,那么(a+0)也是一个地址,“*(a+0)”就是指向“(a+0)”这个地址的内容(即首个元素值)。
a[0]与*(a+0),一个元素地址和一个元素内容又如何能等价~~
请懂C语言的人帮忙解答,指出我的思维误区。我都为这问题冥思苦想好几天了,每次拿起书本就把该节内容看一边,就是不理解这了。 展开
8个回答
展开全部
(a+0)是地址没错
“*(a+0)”就是指向“(a+0)”这个地址的内容(即首个元素值)这句话也没错
因为a这个地址中放的也还是一个地址
======举个例子======
例如:
a[3][3] = { 1 , 2 , 3
4 , 5 , 6
7 , 8 , 9 };
1的地址就是a[0], (a[0]是a[0][0],a[0][1],a[0][2]中第一个数据a[0][0]的地址,下同理)
4的地址就是a[1],
7的地址就是a[2]。
然后你再把这个1、4、7组成的a[0],a[1],a[2]看做一个一维数组
那么a(也可以说是a+0)表示的就是第一个数a[0]的地址。
所以*(a+0)就是地址a中所存放的数值(即a[0]),只不过这个数值是个地址的编号罢了~ 因为地址也是一串数字啊~
你可以就用这个a[3][3]写段代码试试~ 输出 *( *(a+1) + 2 ) 看看是不是等于6~
“*(a+0)”就是指向“(a+0)”这个地址的内容(即首个元素值)这句话也没错
因为a这个地址中放的也还是一个地址
======举个例子======
例如:
a[3][3] = { 1 , 2 , 3
4 , 5 , 6
7 , 8 , 9 };
1的地址就是a[0], (a[0]是a[0][0],a[0][1],a[0][2]中第一个数据a[0][0]的地址,下同理)
4的地址就是a[1],
7的地址就是a[2]。
然后你再把这个1、4、7组成的a[0],a[1],a[2]看做一个一维数组
那么a(也可以说是a+0)表示的就是第一个数a[0]的地址。
所以*(a+0)就是地址a中所存放的数值(即a[0]),只不过这个数值是个地址的编号罢了~ 因为地址也是一串数字啊~
你可以就用这个a[3][3]写段代码试试~ 输出 *( *(a+1) + 2 ) 看看是不是等于6~
展开全部
这个问题我想我能回答你。且听我细说。
首先a是二维数组变量,不要乱说什么首地址,它不是。数组就是数组,它是区别于单个数据的一种类型,不要随便和它对应的单个数据类型随便做比较。
然后我们再说一点,C标准里面有说明,如int a[3][4],为了方便使用,a是可以隐式转换为int (*)[4]的。所以a+0的意思你就明白了,它得到的是int (*)[4]的指针,位置在哪不用我说了。解引用后就是int [4]了。 而a[0]的类型也是int [4]。所以它们是等价的。
有一点可以证明我的说法,请尝试*(a+1),它等于a[1],这足够说明很多人对数组的理解是错误的。
上面还有个说我在胡说,真是搞笑了,同志们,对数组理解的不透就别来误导别人了。如果a真的只是指向首地址的指针,那么请问,下面代码的输出是什么?
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
cout << (*(a + 1))[0] << endl;
随便找个翻译器试试吧,结果是5,而不是2。用你们的破理论讲的通么?如果用我的呢?
首先a是二维数组变量,不要乱说什么首地址,它不是。数组就是数组,它是区别于单个数据的一种类型,不要随便和它对应的单个数据类型随便做比较。
然后我们再说一点,C标准里面有说明,如int a[3][4],为了方便使用,a是可以隐式转换为int (*)[4]的。所以a+0的意思你就明白了,它得到的是int (*)[4]的指针,位置在哪不用我说了。解引用后就是int [4]了。 而a[0]的类型也是int [4]。所以它们是等价的。
有一点可以证明我的说法,请尝试*(a+1),它等于a[1],这足够说明很多人对数组的理解是错误的。
上面还有个说我在胡说,真是搞笑了,同志们,对数组理解的不透就别来误导别人了。如果a真的只是指向首地址的指针,那么请问,下面代码的输出是什么?
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
cout << (*(a + 1))[0] << endl;
随便找个翻译器试试吧,结果是5,而不是2。用你们的破理论讲的通么?如果用我的呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
任何指针, a[0] 就是 *(a+0)
a[i] 就是 *(a+i)
这是个恒等式,不用理解,或者说这就是编译器直接对[]的处理。
a[i] 就是 *(a+i)
这是个恒等式,不用理解,或者说这就是编译器直接对[]的处理。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
简单
数组a[0]就是数组a[0][0],这时的a[0]表示的是一个值;
*(a+0)表示读取数组首地址加0后的值(a+0后还是原地址),这时的*(a+0)也是表示的一个值;
a[0]与*(a+0),并不是你所说的一个是元素地址和一个是元素内容。
数组a[0]就是数组a[0][0],这时的a[0]表示的是一个值;
*(a+0)表示读取数组首地址加0后的值(a+0后还是原地址),这时的*(a+0)也是表示的一个值;
a[0]与*(a+0),并不是你所说的一个是元素地址和一个是元素内容。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
编译器就是这样解释的……
这是规定……
a[i]会被解释成*(a+i)
类似于为什么1+1=2
望楼主采纳~谢谢!
这是规定……
a[i]会被解释成*(a+i)
类似于为什么1+1=2
望楼主采纳~谢谢!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
char a[3][4];
a是指向2维数组的首地址
*a是指向1维数组的首地址
a+1 地址向右偏移4个字节的地址
(*a)+1只是向右偏移1个字节的地址
**a这才是地址下的元素
a[0]与*(a+0)是等价的
a是指向2维数组的首地址
*a是指向1维数组的首地址
a+1 地址向右偏移4个字节的地址
(*a)+1只是向右偏移1个字节的地址
**a这才是地址下的元素
a[0]与*(a+0)是等价的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |