1

好的,所以我正在学习指针,但我无法理解指针在数组中的作用。

基本上给出了这个:

int a[5] = {1,2,4,7,7}; // (allocated at 0xA000)    
int b[5] = {4,3,5,1,8}; // (at 0xA0020)    
short *c[2];            // (at 0xA0040)
c[0] = (short *)b;
c[1] = (short *)a;

我应该确定这些计算的值。

c[0] + 4 

据我了解c是一个指针数组。c[0]是一个包含指向数组第一个元素的指针的short b。如果b开始于0xA0020为什么是那c[0] + 4不是0xA0024,而是它是0xA0028

另外,我应该如何确定c[1][2]. c不是多维数组,那么这个计算将如何进行呢?

谢谢!

4

6 回答 6

5

实际上,当您向指针添加数字时,该数字乘以所指向元素的大小(short在您的情况下,因为您有 a short*)。的大小short在您的计算机上可能是 2 个字节,因此它将 4*2 添加到地址,即 8。

这是来自 MSDN 的链接,它解释了这个概念:

点击这里

于 2013-10-11T06:04:31.340 回答
2

据我了解, c 是一个指针数组。

正确,准确地说:指向short的指针数组

C[0] 是一个short,它保存指向数组b 的第一个元素的指针。如果 B 从 0xA0020 开始,为什么 c[0] + 4 不是 0xA0024 而是 A0028。

不,C[0] 是一个指向 short 的指针。短大小为 2 个字节。当您将整数添加到指针时,您正在添加其指向的类型。在这种情况下,由于 C[0] 是指向 short 的指针,因此 C[0] + 4 表示 C[0] + 4 * 2 以字节为单位。因此,如果 C[0] 指向 0xA0020,则 C[0] + 4 将指向 0xA0028。

另外,我应该如何确定 c[1][2] 的值。C 不是多维数组,那么这个计算将如何进行呢?

C 中的指针语义使您可以将指针视为数组。提供此声明:

int* X;

那么这些等式适用:

      *X == X[0]
*(X + 1) == X[1]

或一般来说:

*(X + n) == X[n]

其中 n 是一个整数值。

您的 C 是一个指针数组,因此第一维将列出指针,第二维是第一维中指针指向的数据。使用上面的等式来找到您问题的答案。

注意:您必须注意的一件事是机器的字节顺序。Little endian 和 big endian 以不同的字节顺序存储大于一个字节的值(short、long、int、long long 等)。

于 2013-10-11T06:11:57.310 回答
1

这是因为短整数的大小是 2 个字节。

当您执行 c[0] +4 时,您是在说“从 c 向前移动 4 个完整空格”,其中“空格”是 c 指向的类型的大小(很短,所以 2 个字节)。

如果 c 是 char*,则结果将是 A0024(因为 char 的大小为 1 个字节)。如果它很长,你会得到 A0030 甚至更多——等等。

于 2013-10-11T06:05:08.507 回答
1

c[0] 不是一个包含指针的short。但它是一个指向空头的指针。增量基于它所指向的大小。看起来其他人刚刚解释过。

于 2013-10-11T06:06:44.090 回答
1

在您的情况下, c[1][2] 为您提供以下内容:
“c”-指向short的指针数组(根据您的代码中的声明)
[1]-给出指针数组的第二个元素“c”(指向整数数组 a)
[2] - 在距离数组“c”的元素 2 的地址(从数组“a”的开头)偏移 sizeof(short)*2 处给出数据(短)
所以它将是一个数组“a”的第二个元素的一半。你得到什么部分取决于你机器的字节顺序。
如果你有小端 - 那么你会得到一个 16 lsb 位的“a”的第二个元素。它是十六进制的 0x0002,或者只是“2”

于 2013-10-11T06:12:24.057 回答
1

(short *)b;严格来说是未定义的行为,任何事情都可能发生。所以正确的答案c[0]+4任何东西

此外,即使特定的编译器可能以特定的确定性方式实现这种未定义的行为,仍然无法通过给出的信息来判断。要回答,您必须知道 int 和 short 的大小,以及特定机器的字节序。

于 2013-10-11T06:15:51.843 回答