[英]Pointer and primitive type return different array members
一些東西。
當我用大小為3
的成員數組聲明結構時,這並不意味着該數組具有4個元素嗎? 0、1、2、3? 為什么當我嘗試插入字符A
, B
和C
,它們告訴我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"}; }
當我打印字符數組的特定索引的地址時,將從以下代碼中獲得以下結果:
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.