二维数组名是不是一个“指针”?

问一:二维数组名是不是一个“指针”?书中说,可以“看成”“指针常量”,但“可以‘看成’”并不代表“是”。问二:二维数组名,是否占用存储空间?是否有其自己的地址呢?还望给出... 问一:二维数组名是不是一个“指针”?书中说,可以“看成”“指针常量”,但“可以‘看成’”并不代表“是”。

问二:二维数组名,是否占用存储空间?是否有其自己的地址呢?

还望给出有依据的答案。

问三:我现在得知有两个答案,一个是说“有”,一个是说“没有”。
说“有”的是把书中的“数组名可以看成指针常量。”
说“没有”的是把指针当成一个“标签”来看待。
理由如下:
“而实际上,数组名字是没有自己的地址的。这个说法好像在书上很少见到的。
在程序里,所有数组都必须是先定义好再使用,也即是说在编译之前,每个访问数组的地方都已经确定了,或者说每个需要出现数组名的地

方都已经出现了数组名了,所以编译器在编译的时候只对数组生成一个标签(标签不属于程序本身,是编译器用的),在编译过程中使用标

签+偏移量来访问数组。对于访问数组的指针就把标签内的地址赋值给该指针。
既然编译器不为数组名字分配存储空间,仅仅为数组成员分配空间,那么数组的名字就不是一个指针(和你说的指针有两个地址矛盾),但

在程序编辑的过程中,把它当成一个指针常量会容易理解一些。”感觉他的解释,我只能了解一个大概。他的意思是不是说“数组名是一个标签,但我们把它当成‘常量指针’”来理解?
修改错误:把上面的改成“指针常量”。
展开
 我来答
夜祖大0l
推荐于2017-09-30 · TA获得超过143个赞
知道答主
回答量:44
采纳率:0%
帮助的人:56.2万
展开全部
1,无论是一维,二维或N维数组,数组名就是一个指针常量,它代表数组元素在内存中的首地址。
2,二维数组名不占存储空间的,如1,数组名只是一个指针常量,打个比方,你的名字指向你这个人,但是你的名字就是人吗?显然不是。数组名也是这个意思。
对于你的提问中:
在程序里,所有数组都必须是先定义好再使用,也即是说在编译之前,每个访问数组的地方都已经确定了,或者说每个需要出现数组名的地方都已经出现了数组名了
这句话是有问题的,只有静态数组的存储空间和区域是确定的,而动态数组的存储空间和区域是不确定的,只是在使用数组前必须定义它的类型,到底是char or int 等等。
对于标签一说,还不如就把数组名当做指针常量来理解呢。你记住,数组名就代表了一个元素首地址。就是一个指针常量。
你也可以自己编程验证嘛,一个很简单的程序:
#include<stdio.h>
void main()
{
int a[3]={0,1,2};
printf("%d\n",a);
printf("%d\n",&a[0]);
}
程序第一行输出的就是数组a的首地址
第二行输出的是a[0]的地址
但是两个值是一样的。
说明数组名就是代表数组的首地址,这是确确实实存在的。希望能帮助你。
追问
您能解答一下 http://zhidao.baidu.com/question/306200462.html?quesup1  我的总结的疑问么?谢谢。
arm999p
2011-08-12
知道答主
回答量:2
采纳率:0%
帮助的人:3412
展开全部
理解一:数组名就是地址常量,地址常量就是不能更改的地址,一旦定义了一个数组就定了
指针是变量,这是和数组本质的区别,他可以令他随意等于任何一个有效的地址
理解二:个人认为数组名不占空间,就是个标志,名字,和人名一样, 人名不占空间,
a=5;a作为左值,实际就是一个地址,在C语言中,广义的说,任何名字(包括函数 名)都是地址,但他们本身不占空间,他们恰恰是空间的名字,他们里面的具体内容占用才是占用空间的,就和你家房子可以说多大面积的,我能说你家地址占多大面积吗
一句话:数组名是地址,指针是存放地址的容器,所以你可以把数组名扔到指针里
总结:只有能放东西的容器才占空间,不能放东西名字都是浮云
追问
我的新问题  http://zhidao.baidu.com/question/306200462.html?quesup1 这是 我的总结的疑问,您能解答一下么?谢谢。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Hernak2011
2011-08-12 · 超过40用户采纳过TA的回答
知道答主
回答量:86
采纳率:0%
帮助的人:112万
展开全部
二维数组名是一个指针,但是说它是常量的意思是它本身不可更改:如你定义int a[34][3],a确实是个指针,*a指向数组中第一个整数;但是你不能通过a++操作使在此操作后a指向数组中第二个整数,而普通指针(int a[12];int *b=a;b 就是普通指针)可以这么操作的,所以说它是“指针常量”;

如果你站在编译器的层次看待数组名,指针名确实是不占据内存的,不信你可以写程序测试一下,一个数组名american 和 a 经过编译后生成的exe程序一个字节都不相差。这是因为编译器把它替换成了特殊的标志,但是本质上讲是这样的:你int a[2]定义一个数组,编译器会分配给你两个int的空间,编译器会把你在任何时刻对这两个字节的访问 编译成你对相应内存单元的访问。
追问
您能解答一下 http://zhidao.baidu.com/question/306200462.html?quesup1  我的总结的疑问么?谢谢。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小飞花儿的忧伤
2011-08-12 · TA获得超过1661个赞
知道小有建树答主
回答量:1152
采纳率:100%
帮助的人:327万
展开全部
数组名只是一段连续空间的名字,跟指针完全不一样。
它不能被改变,谁会去给一个名字加1。
它在值传递时传的是首元素地址,所以很多人把它当做指针。
追问
我的新问题  http://zhidao.baidu.com/question/306200462.html?quesup1 这是 我的总结的疑问,您能解答一下么?谢谢。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
nnxxjj
2011-08-15
知道答主
回答量:6
采纳率:0%
帮助的人:3.8万
展开全部
地位等同的……但是不完全相同
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式