您的位置:首页 > 其它

数组名与指针变量

2016-05-03 10:27 148 查看
今天偶然间看到一个问题,于是乎去学习了下,记录一下对数组名的一个知识点。

数组名:是指针常量。

出错代码:

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 < 10)

还有一点需要说明:

对于上面例子中的bb指针来说,不需要做free(bb)操作,因为aa在结束时候会被干掉,bb要是free的话会造成二次free,这样就报错了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: