数组名与指针变量

今天偶然间看到一个问题,于是乎去学习了下,记录一下对数组名的一个知识点。

数组名:是指针常量。

出错代码:
int aa[10] = {0};
int num = 0;
for(num = 0; num < 10; num ++)
{
    aa[num] = num;
}

int *bb = (int *)malloc(40);
memset((void *)bb, 0, 40);

for(num = 0; num < 10; num ++)
{
    printf("%d\n",aa[0]);
    ++aa;
}

编译就无法通过:error: lvalue required as increment operand

正确代码:
for(num = 0; num < 10; num ++)
{
    printf("%d\n",bb[0]);
    ++bb;
}

原因:aa 数组名是指针常量,不可以进行自加运算。

延伸拓展:
(1) 数组名表示的就是一种数据结构,就是数组;

(2) 数组名可以转换成一个指针常量;

(3) 指向数组的指针则是指针变量,存放着的是数组的地址!

下面又出现一个问题:

void arrayTest(char str[])
{
    printf("%d\n",sizeof(str));
}
int main()
{
    char str1[10] = "I Love U";
    arrayTest(str1);
    return 0;
}

打印结果为4(32位系统)/8(64位系统)。

原因分析 :当数组名作为形参传入时候,只是一个指针变量了,可以做自增、自减操作。
形参char str[]等同于char *str

补充说明:对于一个指针来说,char *aa = (char *)malloc(10);
以下运算合法,与aa是不是数组无关。
*(aa + n) = aa[n];  (n < 10)


还有一点需要说明:

对于上面例子中的bb指针来说,不需要做free(bb)操作,因为aa在结束时候会被干掉,bb要是free的话会造成二次free,这样就报错了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值