求大神::C语言的 &数组名 和 数组名的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求大神::C语言的 &数组名 和 数组名的区别相关的知识,希望对你有一定的参考价值。

1.如果相同,那么将&数组名赋值或者传递给数组参数的时候,会提示:&数组名类型是 int (*)[],而数组类型是int [],他们不能赋值。
2.如果不同,那么为什么,sizeof(&数组名)==sizeof(数组名)??
3.同样,&函数名和函数名的区别
请尽量详尽地回答,最好提供相关资料的连接
谢谢
原来是这样的,&数组名和数组名是不同的,根据其数据类型就知道了。问题的关键在于为什么sizeof(数组名)==sizeof(&数组名)呢,原因如下:
1,数组名本质上是个地址,但不能说是指针,它能给指针赋值,是因为,指针本身的数据结构和数组名(地址)是一样的 都是32位的int,所以这里能通过指针来对数组进行操作
2,sizeof(数组名)为什么等于sizeof(元素类型)*元素个数呢?这个问题就好比 int i;然后sizeof(i)是一样的道理,因为i实际上代表了一块内存为4byte的大小,同理,a这个数组的“名字”也代表了一块数组整体大小的内存块,所以 sizeof(数组名)==sizeof(元素类型)*元素个数
3,&数组名 只是个指向数组名的指针,大小为4byte(32位),所以,它和数组名不能等同
4,vc6下sizeof(&数组名)==sizeof(数组名),我认为是错的,因为我在linux 下用gcc测试int a[10]的结果是:sizeof(a)==40,sizeof(&a)==4,这也论证了第3点是正确的
5,因为个人觉得gcc对ansi c支持得比较好,所以我认为vc6的编译器在此处的处理是错误的
6,以上观点在陈正冲写的《c语言深度解剖》等到了论证,详见此书的第四章 指针和数组

各位的回答都很好,谢谢各位了

1.&数组名作参数传递肯定是不对的,你看一下C语言书中关于数组作参数就知道了(里面例子也能反应)
2.&数组名相当于指针的指针,指向数组名,而数组名又是一个数组的首地址,求sizeof结果是一下的,返回的都是数组的大小
3.&符号有去地址的作用,而数组名本身也是一个地址,它指向的数组的第一行。&数组指向的数组名,是指针的指针。所以才会有:&数组名类型是 int (*)[],而数组类型是int []
参考技术A 是不同的,原因你已经在1里的提示说了,sizeof(指针)的时候,会把指针指向的内容的大小作为返回值,&数组名是一个指向数组的指针,返回的就是其指向的数组的大小,所以是相等的。你可以把数组名和函数名当成一种const类型的指针来理解。追问

sizeof(pointer)的时候,返回的是指针类型的内存大小,如,32位系统指针是4个字节,char c;
sizeof(c)==1; sizeof(&c)==4
所以,我觉得你所说的“sizeof(指针)的时候,会把指针指向的内容的大小作为返回值”有问题

参考技术B 1.&数组名=数组名(值相等,但是类型不一样)
2.都是指针
3.同1,2
http://blog.csdn.net/maybelle0049/archive/2010/06/22/5687845.aspx

参考资料:http://blog.csdn.net/maybelle0049/archive/2010/06/22/5687845.aspx

参考技术C 把int[] 看作 int*
1. &array: int**
array: int*
2. 都是指针
3. 未见过&fun的用法
参考技术D 谢谢楼主,我也被这个问题迷惑,原来是这样啊

从编译器角度分析数组名和指针的区别

链接:http://www.spongeliu.com/28.html

前言

数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变,例如你可以写出下面这样的代码:

int *p;
p++;

却不能写这样的代码:

int a[];
a++;

那么数组名跟指针之间到底有什么区别呢?

区别一

在声明上,除了作为函数参数的数组名总是编译器转化成指针,其他情况下,数组名就是数组名,指针就是指针,二者不能混淆,你不能在一个文件中定义一个数组,而在另一个文件中把它声明成一个指针。

char a[];  //定义一个数组a
extern char* a; //在另一个文件中将a声明成一个指针

在编译器中,符号表用来存放C语言中有关标识符的属性信息,这些信息集中反应了标识符的特征属性。

等到词法分析到代码声称的各个阶段的时候,编译器需要根据源代码提出的要求,从表中获取不同标识符的不同属性。

值得注意的是,数组标识符的属性和指针是完全不同的。因此,在一个文件中定义一个数组的时候,编译器会把它记录在符号表中,而在编译器分析另一个文件中的声明时,通过符号的语义检查发现不一致。

也许这样的声明可以编译通过(在gcc下通过了),但是把一个数组名当成一个指针来使用,别指望它能运行起来。

区别二

在大多数编译器中,对数组的引用a[i]总是被编译器改写成 * (a+i) 的格式。

那么a的值是什么呢?

正如你可以骑走一辆自行车,但是不能骑走一棵树。另外,C语言把数组下标改写成指针偏移量的根本原因是指针和偏移量是底层硬件所使用的基本模型。

区别三

对数组的引用,如a[i],或 * (a+1) ,需要访存一次;而对指针的引用,如 * (p+1) ,需要访存两次。

区别四

p = a;

另外,sizeof(a)得到的是a所表示的数组的大小,而sizeof(p)得到的是指针的大小。

温馨提示

免责声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。


猜你喜欢:




从编译器角度分析数组名和指针的区别

文章都看完了不点个吗

以上是关于求大神::C语言的 &数组名 和 数组名的区别的主要内容,如果未能解决你的问题,请参考以下文章

详解C语言指针

C语言进阶4——指针的进阶

C语言重难点总结:指针

C语言进阶玩转指针——指针的高阶玩法!

在C语言中如何区分数组中的空格,并提取数组单个字符!求大神讲解!

C语言,数组输入遇到问题求大神指教:哪里错了,如何改正,为啥会出现这种情况?