| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1740 人关注过本帖
标题:关于多位数组的数组名指针问题
只看楼主 加入收藏
davidguhao
Rank: 1
来 自:广东
等 级:新手上路
帖 子:126
专家分:7
注 册:2016-7-18
结帖率:89.47%
收藏
 问题点数:0 回复次数:10 
关于多位数组的数组名指针问题
程序代码:
// multiarray.c--多维数组和指针的示例

#include <stdio.h>

int multi[2][4];
int main(void)
{
printf("\nmulti = %d", multi);
printf("\nmulti[0] = %d", multi[0]);
printf("\n&multi[0][0] = %d\n", &multi[0][0]);

return 0;
}

为什么三个值都是一样的?
multi不是指向multi[0]的指针吗?
为什么multi的数值会和multi[0]相同都是multi[0][0]的地址?
2016-08-12 15:24
captain2050
Rank: 2
等 级:论坛游民
帖 子:57
专家分:43
注 册:2016-7-15
收藏
得分:0 
首先你要知道数组名里装的是数组首元素地址,mlti是multi[0]的地址,multi[0]是multi[0][0]的地址。
而他们的地址在“数值上”都等于二维数组首元素的地址,所以都一样。
2016-08-12 15:32
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 

为什么三个值都是一样的? ------ 你的脚、你的腿,和你 三个为什么都在同一个地址呢?
multi不是指向multi[0]的指针吗? ------ 不是,你谭浩强的书看多了,multi是数组不是指针
为什么multi的数值会和multi[0]相同都是multi[0][0]的地址? ------- multi的数值?不纠正你这些感念错误了。火车所在位置为什么和火车头所在位置要不一样呢?

printf("\nmulti = %d", multi); // 不是%d,是%p,多看正书吧
2016-08-12 16:10
c_rookie
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-8-12
收藏
得分:0 
有个人的名字叫AB。
请问你全名的第一个字是什么,此人回答A。
请问你姓什么,此人回答A。

printf("Hello, C world.\n");
2016-08-12 16:14
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用rjsp在2016-8-12 16:10:48的发言:
printf("\nmulti = %d", multi); // 不是%d,是%p,多看正书吧

试这样看看又有什么不同:
printf("\nmulti = %d, 0x%x, 0x%p", multi, multi, multi);
2016-08-12 18:59
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
因为multi[2][4]数组有4列,所以multi是占用4个int型的数组首地址,是个常量,multi[0]是占用1个int型的数组首地址,&multi[0][0]是multi[0][0]的地址,他们的值是一样的。输出类型是%p,如果编译器不支持可以用%u或%lu。由于multi是4个int型的首地址,所以multi+1和&multi[1][0]的值是一样的,而multi[0]+1和&multi[0][1]的值是一样的。

[此贴子已经被作者于2016-8-13 08:52编辑过]

2016-08-12 22:20
zx315
Rank: 5Rank: 5
来 自:广东
等 级:职业侠客
威 望:2
帖 子:86
专家分:378
注 册:2016-7-13
收藏
得分:0 
回复 楼主 davidguhao
int multi[2][4];


首先,数组名可以作为指向数组第一个元素的指针。然后,所谓二维数组,然后是数组元素是一维数组的一维数组。

因此:
multi 是一个指向含有 3 个整型元素的指针;
multi[0] 其实是一个一维数组,所以它是一个指向整数的指针;
multi[0][0] 很显然就是二维数组的第一个元素。

程序代码:
int (*p1)[3] = multi;
int *p2 = multi[0];
int *p3 = &multi[0][0];


p1 跟 p2, p3 显然是类型不一样的指针;而 p2, p3 是类型相同的指针。


Read The Fucking Source Code~
2016-08-13 00:08
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用zx315在2016-8-13 00:08:03的发言:


int multi[2][4];


首先,数组名可以作为指向数组第一个元素的指针。然后,所谓二维数组,然后是数组元素是一维数组的一维数组。

因此:
multi 是一个指向含有 3 个整型元素的指针;
multi[0] 其实是一个一维数组,所以它是一个指向整数的指针;
multi[0][0] 很显然就是二维数组的第一个元素。


int (*p1)[3] = multi;
int *p2 = multi[0];
int *p3 = &multi[0][0];


p1 跟 p2, p3 显然是类型不一样的指针;而 p2, p3 是类型相同的指针。

确是,体现了指针的两个重要属性:地址和长度。
虽然都是int指针,都指向同一地址,但他们的内含不同。
这样看看好理解点:
#include <stdio.h>

int multi[2][4];
int main(void)
{
printf("\nmulti = %d", multi);
printf("\nmulti[0] = %d", multi[0]);
printf("\n&multi[0][0] = %d\n", &multi[0][0]);

    int (*p)[4] = multi;
    int *p0  = multi[0];
    int *p00 = &multi[0][0];

    printf("p = %d\n", p);
    printf("p0 = %d\n", p0);
    printf("p00 = %d\n", p00);

    printf("++p = %d\n", ++p);
    printf("++p0 = %d\n", ++p0);
    printf("++p00 = %d\n", ++p00);

return 0;
}

结果:
multi = 4214816
multi[0] = 4214816
&multi[0][0] = 4214816
p = 4214816
p0 = 4214816
p00 = 4214816
++p = 4214832
++p0 = 4214820
++p00 = 4214820

可见 p 长度是16, p0和p00是4。

2016-08-13 07:01
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
多看书,多找资料。
像这个问题,如果你自己去找资料,肯定能更好的理解数组和指针。
而不是单单看楼上几位大神的回贴,这只是他们阅读资料和实践经验的结果,这个结果对你的作用不大。
2016-08-13 07:01
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用linlulu001在2016-8-13 07:01:49的发言:

多看书,多找资料。
像这个问题,如果你自己去找资料,肯定能更好的理解数组和指针。
而不是单单看楼上几位大神的回贴,这只是他们阅读资料和实践经验的结果,这个结果对你的作用不大。

确是,书本较系统规范论述。
在理解一些抽象概念时,能结合实际和具体分析,对更深入理解和提高认识会有帮助。
例如,说到数据类型,不同的编程语言有不同的说法,可是五花八门,甚至可以自定义,这都是为了提高编程语言的表达能力、更好阅读和理解。但可以想想,这些五花八门的东西,实质是什么?说到底都是bit,这是最基本的数据类型。
要活学活用,应无所住而生其心。
2016-08-13 07:30
快速回复:关于多位数组的数组名指针问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024581 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved