我可以像数组一样访问指针吗?

时间:2017-01-30 13:49:29

标签: c arrays pointers dynamic-memory-allocation

当我有int *integers;时,我使用
分配内存 integers = (int *)malloc(sizeof(int) * 10);,我可以使用integers[1]访问存储在其中的第二个值,还是必须使用*(integers + 1)进行访问?

3 个答案:

答案 0 :(得分:3)

是的,您可以通过指针访问值,就像它们是数组一样。

在正常情况下(除了&sizeof或字符串文字之外的任何用法),数组会转换为指向其第一个元素的指针,因此,实际上,使用数组转换使用指针,而不是相反。

答案 1 :(得分:3)

下标运算符[]在指针运算方面是定义的。表达式a[i]被评估为*(a + i) - 给定地址a,偏离该地址的i元素并取消引用结果 1

所以,是的,你可以在指针表达式和数组表达式上使用[]运算符。

请记住,使用指针算法时,会考虑指向类型的大小 - 如果a是指向int的指针,那么a + 1会产生地址下一个整数对象(可以是a中2到4到8个字节的任何位置)。

还记得数组不是指针 - 数组表达式将被转换(“衰变”)到指针表达式,除非它是{{1的操作数或一元sizeof运算符,或者是用于初始化声明中的字符数组的字符串文字。

<小时/>

  1. 这也意味着数组索引是可交换的 - &。但是,您很少会在International Obfuscated C Code Contest之外看到a[1] == 1[a]

答案 2 :(得分:0)

  

我可以使用整数1来访问存储在那里的第二个值,或者我必须使用*(整数+ 1)来执行此操作吗?

是的,你可以。数组名称衰减为指针,因此在这两种情况下,您都可以表现为指针指向数据的第一个元素。

注意:请参阅this link,了解为什么不应该投射malloc的结果。