簡體   English   中英

指針和原始類型返回不同的數組成員

[英]Pointer and primitive type return different array members

一些東西。

  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 << "hg[" << i << "]" << harry.grade[i] << endl; for (int i = 0; i < 4; i++) cout << "hg[" << 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等,而不是像第一個循環那樣分別打印每個字符?

不,聲明一個類似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及其后面的字符的原因。

當我用大小為3的成員數組聲明結構時,這是否意味着該數組具有4個元素? 0、1、2、3?

不,這意味着它具有三個元素,您可以使用索引0,1,2進行訪問。

為什么第一個索引先打印ABC,然后再打印BC,以此類推,而不是像第一個循環那樣分別打印每個字符?

您正在訪問超出數組范圍的邊界,這將導致 未定義的行為 那意味着什么都可能發生。 您還正在將大小為4的字符數組 "ABC"分配給大小為3的數組。 因此,您沒有綁定訪問權限。 char數組“ ABC”中的第4個元素為空終止\\0 當您使用std::cout打印char[N]的任何元素的地址時,它將看到一個char* ,它將其解釋為以空字符結尾的字符串。 因此它將打印字符直到空終止。 因此,如果從頭開始打印,則會得到A, b, C 如果從第二個元素打印,則得到B,C ,依此類推。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM