指针和基元类型返回不同的数组成员

时间:2013-02-07 21:08:51

标签: c++

一些事情。

  1. 当我用一个大小为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;
    }
    
  3. 结果:

    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,而不是像第一个循环一样分别打印每个字符?

2 个答案:

答案 0 :(得分:3)

不,声明像T arr[3]这样的数组会给你一个包含3个元素的数组,而不是4.声明中的3是数组的大小。指数从0开始,因此元素的指数为0,1和2。

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

  

没有比数组元素更多的初始化器。

在第一个循环中,您将获取阵列的每个字符并将其打印出来。当您打印char时,您只获得char作为输出。

当您使用&harry.grade[i]获取数组元素的地址时,会得到char*。输出char*时,I / O库将其视为C样式的以null结尾的字符串。它将从该字符输出到它找到的第一个空字符。这就是为什么你得到位置i的角色和跟随它的角色。

答案 1 :(得分:1)

  

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

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

访问它们
  

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

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