gpt4 book ai didi

c - C 中的指针索引是什么,它们引用什么?

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:53 25 4
gpt4 key购买 nike

我已经搜索了一段时间,但大多数结果并没有多大帮助,因为几乎所有与索引和指针相关的问题都指向数组。我有一个概念性问题,即可视化指针的索引可能是什么。此示例函数从参数中获取 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] 可能引用什么。

如果更谨慎的人可以在这里阐明我,那就太好了。

最佳答案

为了帮助您更好地理解,让我们尝试使其更加“图形化”...

内存是一系列可以存储值的连续位置。在你分配 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 propertyaddition ,表达式 *(ip + i) 当然与 *(i + ip) 相同,这导致了奇怪但有效的转换 ip[i ]i[ip] 相同。

关于c - C 中的指针索引是什么,它们引用什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35982542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com