0

一些东西。

  1. 当我用 size 的成员数组声明我的结构时3,这是否意味着该数组有 4 个元素?0、1、2、3?为什么他们,当我尝试插入字符ABC它告诉我initializer-string for array of chars is too long [-fpermissive]

    #include <iostream>
    using namespace std;
    
    struct Student {
        double no;
        char grade[3];
    };
    
    int main() {
        struct Student harry = {975, "ABC"};
    }
    
  2. 当我打印字符数组的特定索引的地址时,我从以下代码中得到以下结果:

    struct Student {
        double no;
        char grade[4];
    };
    
    int main() {
    
        struct Student harry = {975, "ABC"};
    
        for (int i = 0; i < 4; i++)
            cout << "h.g[" << i << "]" << harry.grade[i] << endl;
    
        for (int i = 0; i < 4; i++)
            cout << "h.g[" << i << "]" << &harry.grade[i] << endl;
    }
    

结果:

h.g[0]A
h.g[1]B
h.g[2]C
h.g[3]
&h.g[0]ABC
&h.g[1]BC
&h.g[2]C
&h.g[3]

为什么第一个索引打印ABC, 然后BC, 等等而不是像第一个循环那样单独打印每个字符?

4

2 回答 2

3

不,声明一个数组 likeT arr[3]会给你一个包含 3 个元素的数组,而不是 4 个。声明中的 3 是数组的大小。索引从 0 开始,因此元素的索引是 0、1 和 2。

字符串文字"ABC"为您提供了一个“4 数组const char”,其中最后一个元素是空字符。如果您尝试使用包含太多字符的字符串文字来初始化数组,则您的程序格式错误:

初始化器的个数不得多于数组元素的个数。

在第一个循环中,您将获取数组的每个字符并将其打印出来。当您打印 a 时,char您只会得到它char作为输出。

当您获取数组元素的地址时&harry.grade[i],您会得到一个char*. 当您输出 achar*时,I/O 库将其视为 C 风格的以空值结尾的字符串。它将从该字符输出到它找到的第一个空字符。这就是为什么你让角色在位置上i,然后在它后面的角色。

于 2013-02-07T21:10:33.657 回答
1

当我用大小为 3 的成员数组声明我的结构时,这不意味着该数组有 4 个元素吗?0、1、2、3?

不,这意味着它具有三个元素,您可以使用索引 0、1、2 访问它们。

为什么第一个索引打印 ABC,然后是 BC,等等,而不是像第一个循环那样分别打印每个字符?

您正在访问超出数组的范围,这会导致未定义的行为。这意味着任何事情都可能发生。您还将一个大小为 4 的字符数组 , 分配给"ABC"一个大小为 3 的数组。所以你没有债券的读写权限。 char 数组“ABC”中的第 4 个元素是 null-termination \0。当您用 打印 a 的任何元素的地址时char[N]std::cout它会看到 a char*,它会将其解释为以 null 结尾的字符串。所以它将打印字符直到空终止。所以如果你从头开始打印,你会得到A, b, C. 如果你从你得到的第二个元素打印B,C,依此类推。

于 2013-02-07T21:10:09.257 回答