没有。你的理解是非常非常错误的。
数组是连续内存中的 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