【问题标题】:Do all arrays contain pointers?所有数组都包含指针吗?
【发布时间】:2017-11-26 22:22:37
【问题描述】:

我的理解是字符数组的值都是指针,而不是实际的ASCII整数。

所有其他数组都一样吗?例如,结构数组。该数组的第 $i$ 个元素是指向第 $i$th 结构的指针吗?

【问题讨论】:

  • chars 的数组包含字符,而不是指针。
  • T 的数组包含 T 的实例,而不是指向 T 的指针。
  • 我的理解是字符数组的值都是指针你的理解是错误的。

标签: c++ arrays pointers


【解决方案1】:

没有。你的理解是非常非常错误的。

数组是连续内存中的 T 类型序列。字符数组是最容易可视化的 - 8 个字符的数组将是一个 8 字节的内存块。在具有 4 字节整数的系统上,8 个整数的数组将是 8*4 = 32 字节的块。如果struct T 的大小为 32 字节,则 8 个结构 T 的数组将为 8*32 = 256 字节。所有这些都应该让您相信数组是实际的对象,而不是指向项目的指针。可能出现混淆的地方是您可以在某种程度上互换使用数组和指针。让我用整数来说明,我们将回到字符。

int intArray[10] 是一个由 10 个整数组成的数组。您可以将intArray 视为一个数组或int*,如下所示:

int intArray[10] = {100, 200, 300, 400, 500, 600 ,700, 800, 900, 1000};
int* p = intArray;
for(int i = 0; i < 10; i++)
{
    std::cout << "*p = " << *p << "\n";
    std::cout << "[" << i << "] = " << intArray[i] << "\n";
    p++;
}

这与让您将字符数组视为字符串的行为相同。

char charArray[4];
char *p = charArray;
// Insert characters one by one - no pointers here
charArray[0] = 'H';
charArray[1] = 'i';
charArray[2] = '.';
charArray[3] = 0;
// We can just use the pointer because char* is often assumed to be a 0
// terminated string.
std::cout << "p='" << p << "'\n";
std::cout << "charArray='" << charArray << "'\n";

有一个常见的约定,即假设 char* 是一个以 0 结尾的字符数组,可以用作字符串,但并非必须如此。您可以只拥有一个不以 0 结尾的字符数组。 Kust 与任何其他数组一样,由您来记住长度。

char cA[4] = { 0x66, 0x67, 0x68, 0x69 };
std::cout << "cA='" << cA << "\n";
// UNDEFINED BEHAVIOR. cA is not 0 terminated

【讨论】:

  • 添加一些关于数组在内存中的表示方式,以及intArray 实际上是什么(指向彼此相邻堆叠的 10 个整数的指针)
  • @pepperjack 不,intArray 不是指针。这是一个数组。
  • @BaummitAugen 我并不是说它是一个指针,我的意思是解释它是如何像指针一样工作的。对不起。
  • @pepperjack 除了operator [] 语法之外,它的功能不像指针一样,而且它也不限于数组和指针。
  • @BaummitAugen 阅读了答案,他已经将其解释为指针。这就是我想要的。
猜你喜欢
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
相关资源
最近更新 更多