C中的指针索引是什么?它们引用了什么?

时间:2016-03-14 08:21:47

标签: c pointers indexing

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

如果有更谨慎的人能在这里照亮我,那真的很棒。

2 个答案:

答案 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 propertyaddition,表达式*(ip + i)当然与*(i + ip)相同这导致了ip[i]i[ip]相同的奇怪但有效的转换。

答案 1 :(得分:0)

ip[n]*(ip+n)相同。

您可以在距地址ip[n]的{​​{1}} n-th integer integer处看到ip。通常这种类型的语法出现在数组中。

此外,如果您没有正确分配内存,则可能会遇到一些运行时错误/调用未定义的行为。