数组名与指针

数组名和指针的概念很容易搞混淆,比如函数传参的时候,数组名作为形参,但是进去用的时候却和指针用法一摸一样,但是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个内存的首地址。
汇编里面标号就是一个地址,但是这个地址是由编译器来记住的,我们想访问这个地址的时候,由编译器来翻译这个标号为地址。我们将数组名作为参数传给函数的时候,其实是传的一个地址过去(也可以理解为标号地址的拷贝),也就是一个指针了,所以我们在函数里可以对这个传进来的数组名进行指针的操作。
还有一个问题就是,我们对数组名正常访问的时候,数组名是不能自加的,也就可以解释了,它是一个标号,可以理解为一个常量指针,是一个不变的地址。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值