今天偶然间看到一个问题,于是乎去学习了下,记录一下对数组名的一个知识点。
数组名:是指针常量。
出错代码:
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,这样就报错了。