数组名与指针

来源:互联网 发布:用vb设计计算机程序 编辑:程序博客网 时间:2024/04/26 07:53

数组名和指针的概念很容易搞混淆,比如函数传参的时候,数组名作为形参,但是进去用的时候却和指针用法一摸一样,但是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 的大小是 12a:    .long  1            //初始化 a    .long  2    .long  3    .globl  mainmain:

通过反汇编后,数组名的含义也就非常清晰了,它就是一个变量名,它本身并不占用内存!!它的形式是一个标号,并且给它的size属性设置为12 ,所以sizeof(a) = 12 . &a 便得到这12个内存的首地址。
汇编里面标号就是一个地址,但是这个地址是由编译器来记住的,我们想访问这个地址的时候,由编译器来翻译这个标号为地址。我们将数组名作为参数传给函数的时候,其实是传的一个地址过去(也可以理解为标号地址的拷贝),也就是一个指针了,所以我们在函数里可以对这个传进来的数组名进行指针的操作。
还有一个问题就是,我们对数组名正常访问的时候,数组名是不能自加的,也就可以解释了,它是一个标号,可以理解为一个常量指针,是一个不变的地址。