我已经搜索了一段时间,大多数结果都没有帮助,因为几乎所有索引和指针相关的问题都朝向数组。我有一个概念性问题,可视化指针的索引。此示例函数从参数中获取argv[1]
:
unsigned long pointerfun(const char* p){
int* ip; // Declare an int pointer ip
ip = (int*)p; // Initialize the pointer with the value of p cast to an int pointer
int i;
int res=0;
for(i=0; i<5; i++){ // Loops from 0 to 4
res += ip[i]; // ...incrementing res by ip[0], ip[1],...
}
return res;
}
所以我意识到指针指向一个内存位置,在我的示例代码中,ip指向输入的任何内存地址为p。但根据我的理解,指针不是数据结构,所以我不知道ip[0,1,...,4]
可能引用什么。
如果有更谨慎的人能在这里照亮我,那真的很棒。
答案 0 :(得分:3)
为了帮助您更好地理解,让我们尝试使其更具“图形化”......
内存是一系列可以存储值的连续位置。完成作业ip = (int*)p
后,您可以按照ip
这样查看:
ip | v +-------+-------+-------+---- | ip[0] | ip[1] | ip[2] | ... +-------+-------+-------+---- ^ ^ ^ ^ | | | | 100 104 108 112
由于ip
是一个指针,所以它指向的“数组”确实没有特定的结束,你必须跟踪自己的结束。
现在谈到解决问题时,为了简单起见,我们可以说ip
指向地址100
,这意味着变量ip
的内容为100
。让我们说sizeof(int) == 4
。
然后当你执行ip[2]
时,它与执行*(ip + 2)
相同,那么您将2 * sizeof(int)
(即8
)添加为 byte 偏移到指针,并获取地址108
,然后取消引用,为您提供ip[2]
的内容(无论可能是什么)。
现在有点好奇并“真正炒你的面条”:感谢commutative property的addition,表达式*(ip + i)
当然与*(i + ip)
相同这导致了ip[i]
与i[ip]
相同的奇怪但有效的转换。
答案 1 :(得分:0)
ip[n]
与*(ip+n)
相同。
您可以在距地址ip[n]
的{{1}} n-th integer
integer
处看到ip
。通常这种类型的语法出现在数组中。
此外,如果您没有正确分配内存,则可能会遇到一些运行时错误/调用未定义的行为。