2013-02-07 47 views
0

几件事。指针和原始类型返回不同的阵列成员

  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; 
    } 
    

结果:

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等等每个字符的分开像第一个循环?

+0

大小3意味着3个元素。真的很简单。如果它有4个元素,其大小将为4.“大小”并不意味着“最后一个元素的索引”,这意味着大小。 –

回答

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的字符和它后面的字符。

+0

解释它,非常感谢。 – eveo

+0

@eveo我刚刚更新。你的代码不应该被编译。你正在使用哪种编译器? –

+0

g ++,第二段代码将'grade'初始化为4,而不是由第一个3个索引产生的错误。 – eveo

1

当我用大小为3的成员数组声明我的结构时,是不是表示该数组有4个元素? 0,1,2,3?

不,这意味着它有三个元素,您可以通过索引0,1,2访问它。

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

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

+0

第二个问题没有从第一个问题中假定“等级”的定义。我以不同的方式宣布尺寸。 – eveo

+0

@eveo对此感到抱歉。我想我现在回答这个问题。 – juanchopanza