C中 数组和指针的异同

发布网友 发布时间:2022-03-31 10:18

我来回答

1个回答

热心网友 时间:2022-03-31 11:47

“在表达式中,数组名总是被转换为指向该数组第一个元素的指针“
在C语言中,数组名是一个左值,不是指针,之所以说“在表达式中,数组名总是被转换为指向该数组第一个元素的指针“是因为你可以使用用于操作指针的解引用符号"*"对数组名进行操作,或者你可以将一个数组名赋值给一个指针变量。
但实际上对数组名的操作和对指针的操作在汇编层是不同的。
数组int array[10]:
执行表达式 X = array[3]只需要两条汇编语句:
mov -0x10(%ebp),%eax /* -0x10(%ebp)是array[3]的内容 */
mov %eax,-0x8(%ebp) /* %ebp - 0x8 是X的地址 */

同样的操作,看指针是什么情况。
指针int *array_p = array;
执行表达式 X = array_p[3]会被编译器翻译成"X = *(array_p + 3);",看它的汇编代码:
mov -0x4(%ebp),%eax /* %ebp - 0x4 是array_p的左值,它存放了数组array的第一个元素的地址
* 即array的值*/
add $0xc,%eax /* 将数组0元素地址+0xc得到第三个元素的地址 */
mov (%eax),%eax /* 取出这个值 */
mov %eax,-0x8(%ebp) /* 将array[3]的(右)值存储到X中 */

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com