数组名和指针的概念很容易搞混淆,比如函数传参的时候,数组名作为形参,但是进去用的时候却和指针用法一摸一样,但是sizeof(数组名)大小却不等于指针的大小(数组size不为1)。并且数组名不能用 自加运算符,说明他应该是一个“常量”。
直接通过反汇编来看看数组具体是怎么定义的吧:
#include <stdio.h>
#include <string.h>
int a[3] = {1,2,3};
int main()
{
return 0;
}
上面定义了一个全局数组变量a ,下面是它的反汇编结果。
.globl a //申明全局变量 a
.align 4 //对齐为4
.size a, 12 //a 的大小是 12
a:
.long 1 //初始化 a
.long 2
.long 3
.globl main
main:
通过反汇编后,数组名的含义也就非常清晰了,它就是一个变量名,它本身并不占用内存!!它的形式是一个标号,并且给它的size属性设置为12 ,所以sizeof(a) = 12 . &a 便得到这12个内存的首地址。
汇编里面标号就是一个地址,但是这个地址是由编译器来记住的,我们想访问这个地址的时候,由编译器来翻译这个标号为地址。我们将数组名作为参数传给函数的时候,其实是传的一个地址过去(也可以理解为标号地址的拷贝),也就是一个指针了,所以我们在函数里可以对这个传进来的数组名进行指针的操作。
还有一个问题就是,我们对数组名正常访问的时候,数组名是不能自加的,也就可以解释了,它是一个标号,可以理解为一个常量指针,是一个不变的地址。