二维数组名是不是一个“指针”?
问一:二维数组名是不是一个“指针”?书中说,可以“看成”“指针常量”,但“可以‘看成’”并不代表“是”。问二:二维数组名,是否占用存储空间?是否有其自己的地址呢?还望给出...
问一:二维数组名是不是一个“指针”?书中说,可以“看成”“指针常量”,但“可以‘看成’”并不代表“是”。
问二:二维数组名,是否占用存储空间?是否有其自己的地址呢?
还望给出有依据的答案。
问三:我现在得知有两个答案,一个是说“有”,一个是说“没有”。
说“有”的是把书中的“数组名可以看成指针常量。”
说“没有”的是把指针当成一个“标签”来看待。
理由如下:
“而实际上,数组名字是没有自己的地址的。这个说法好像在书上很少见到的。
在程序里,所有数组都必须是先定义好再使用,也即是说在编译之前,每个访问数组的地方都已经确定了,或者说每个需要出现数组名的地
方都已经出现了数组名了,所以编译器在编译的时候只对数组生成一个标签(标签不属于程序本身,是编译器用的),在编译过程中使用标
签+偏移量来访问数组。对于访问数组的指针就把标签内的地址赋值给该指针。
既然编译器不为数组名字分配存储空间,仅仅为数组成员分配空间,那么数组的名字就不是一个指针(和你说的指针有两个地址矛盾),但
在程序编辑的过程中,把它当成一个指针常量会容易理解一些。”感觉他的解释,我只能了解一个大概。他的意思是不是说“数组名是一个标签,但我们把它当成‘常量指针’”来理解?
修改错误:把上面的改成“指针常量”。 展开
问二:二维数组名,是否占用存储空间?是否有其自己的地址呢?
还望给出有依据的答案。
问三:我现在得知有两个答案,一个是说“有”,一个是说“没有”。
说“有”的是把书中的“数组名可以看成指针常量。”
说“没有”的是把指针当成一个“标签”来看待。
理由如下:
“而实际上,数组名字是没有自己的地址的。这个说法好像在书上很少见到的。
在程序里,所有数组都必须是先定义好再使用,也即是说在编译之前,每个访问数组的地方都已经确定了,或者说每个需要出现数组名的地
方都已经出现了数组名了,所以编译器在编译的时候只对数组生成一个标签(标签不属于程序本身,是编译器用的),在编译过程中使用标
签+偏移量来访问数组。对于访问数组的指针就把标签内的地址赋值给该指针。
既然编译器不为数组名字分配存储空间,仅仅为数组成员分配空间,那么数组的名字就不是一个指针(和你说的指针有两个地址矛盾),但
在程序编辑的过程中,把它当成一个指针常量会容易理解一些。”感觉他的解释,我只能了解一个大概。他的意思是不是说“数组名是一个标签,但我们把它当成‘常量指针’”来理解?
修改错误:把上面的改成“指针常量”。 展开
展开全部
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]的地址
但是两个值是一样的。
说明数组名就是代表数组的首地址,这是确确实实存在的。希望能帮助你。
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 我的总结的疑问么?谢谢。
展开全部
理解一:数组名就是地址常量,地址常量就是不能更改的地址,一旦定义了一个数组就定了
指针是变量,这是和数组本质的区别,他可以令他随意等于任何一个有效的地址
理解二:个人认为数组名不占空间,就是个标志,名字,和人名一样, 人名不占空间,
a=5;a作为左值,实际就是一个地址,在C语言中,广义的说,任何名字(包括函数 名)都是地址,但他们本身不占空间,他们恰恰是空间的名字,他们里面的具体内容占用才是占用空间的,就和你家房子可以说多大面积的,我能说你家地址占多大面积吗
一句话:数组名是地址,指针是存放地址的容器,所以你可以把数组名扔到指针里
总结:只有能放东西的容器才占空间,不能放东西名字都是浮云
指针是变量,这是和数组本质的区别,他可以令他随意等于任何一个有效的地址
理解二:个人认为数组名不占空间,就是个标志,名字,和人名一样, 人名不占空间,
a=5;a作为左值,实际就是一个地址,在C语言中,广义的说,任何名字(包括函数 名)都是地址,但他们本身不占空间,他们恰恰是空间的名字,他们里面的具体内容占用才是占用空间的,就和你家房子可以说多大面积的,我能说你家地址占多大面积吗
一句话:数组名是地址,指针是存放地址的容器,所以你可以把数组名扔到指针里
总结:只有能放东西的容器才占空间,不能放东西名字都是浮云
追问
我的新问题 http://zhidao.baidu.com/question/306200462.html?quesup1 这是 我的总结的疑问,您能解答一下么?谢谢。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
二维数组名是一个指针,但是说它是常量的意思是它本身不可更改:如你定义int a[34][3],a确实是个指针,*a指向数组中第一个整数;但是你不能通过a++操作使在此操作后a指向数组中第二个整数,而普通指针(int a[12];int *b=a;b 就是普通指针)可以这么操作的,所以说它是“指针常量”;
如果你站在编译器的层次看待数组名,指针名确实是不占据内存的,不信你可以写程序测试一下,一个数组名american 和 a 经过编译后生成的exe程序一个字节都不相差。这是因为编译器把它替换成了特殊的标志,但是本质上讲是这样的:你int a[2]定义一个数组,编译器会分配给你两个int的空间,编译器会把你在任何时刻对这两个字节的访问 编译成你对相应内存单元的访问。
如果你站在编译器的层次看待数组名,指针名确实是不占据内存的,不信你可以写程序测试一下,一个数组名american 和 a 经过编译后生成的exe程序一个字节都不相差。这是因为编译器把它替换成了特殊的标志,但是本质上讲是这样的:你int a[2]定义一个数组,编译器会分配给你两个int的空间,编译器会把你在任何时刻对这两个字节的访问 编译成你对相应内存单元的访问。
追问
您能解答一下 http://zhidao.baidu.com/question/306200462.html?quesup1 我的总结的疑问么?谢谢。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
数组名只是一段连续空间的名字,跟指针完全不一样。
它不能被改变,谁会去给一个名字加1。
它在值传递时传的是首元素地址,所以很多人把它当做指针。
它不能被改变,谁会去给一个名字加1。
它在值传递时传的是首元素地址,所以很多人把它当做指针。
追问
我的新问题 http://zhidao.baidu.com/question/306200462.html?quesup1 这是 我的总结的疑问,您能解答一下么?谢谢。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询