[英]Why can't we initialize a 2D integer array as a pointer?
為什么將2D字符數組初始化為指針,但不能初始化為2D整數數組? 為什么在嘗試這樣做時會出現錯誤? 另外,將數組初始化為指針意味着什么?
#include<stdio.h>
int main()
{
char* m[] = { "Excellent","Good", "bad" };
int* x[] = { {1,2,3},{4,5,6} };
return 0;
}
在聲明的上下文中, {
和}
僅表示“這是一組事物”。它們不表示對象,地址或數組。 (注意:在初始化中,有一些表達式,並且這些表達式可以在確實表示對象的某些上下文中包含花括號。但是,在問題所示的代碼中,花括號只是將事物組合在一起。)
以char* m[] = { "Excellent","Good", "bad" };
,其中列出了三個用於初始化m
: "Excellent"
, "Good"
和"bad"
。 因此,每個項目都會初始化m
一個元素。
"Excellent"
是字符串文字。 在編譯過程中,它成為字符數組,以空字符終止。 在某些情況下,數組將保留為數組:
sizeof
的操作數時。 &
(用於接收地址)的操作數時。 這些都不適用於這種情況。 "Excellent"
不是sizeof
的操作數,也不是&
的操作數,它只是初始化m
一個元素,而不是整個數組。 因此,該數組不會保留為數組:根據C中的規則,它會自動轉換為指向其第一個元素的指針。 然后,該指針初始化m[0]
: m[0]
是指向"Excellent"
的第一個元素的指針。
類似地, m[1]
初始化為指向"Good"
的第一個元素的指針,而m[2]
初始化為指向"bad"
的第一個元素的指針。
int* x[] = { {1,2,3},{4,5,6} };
,列出了兩件事來初始化x
。 這些事物中的每一個本身都是一組(由三個事物組成)。 但是, x
是int *
的數組。 x
每個成員都應使用指針進行初始化。 但是{1,2,3}
三件事情不是一個指針。
初始化數組和結構時,用於解釋事物組的C規則有點復雜,因為它們旨在為省略括號提供一定的靈活性,因此我必須多研究一些標准以解釋它們在此處的應用。 可以說編譯器將聲明解釋為使用1
初始化x[0]
。 由於1
是一個int
而x[0]
是一個int *
,因此編譯器會抱怨類型不匹配。
char *m[]
不聲明二維數組。 它是指向char
的指針的數組。 由於C的規則,通常可以在語法上以與二維數組相同的方式使用它,因此m[i][j]
選擇字符串i
字符j
。 但是, char *m[]
和char a[3][4]
之間存在區別,例如:
m[i][j]
, m[i]
是一個指針。 該指針是從內存中加載的,並用作[j]
的基地址。 然后將j
添加到該地址,並從內存中加載該字符。 在此評估中有兩個內存負載。 a[i][j]
, a[i]
是一個數組。 此數組的位置是從a的開頭通過算術計算得出a
。 那么a[i][j]
是一個char
,其地址通過加j
來計算,並且那里的字符是從內存中加載的。 在此評估中有一個內存負載。 有一種語法可以初始化一個int
指針數組,以指向一個int
數組。 它稱為復合文字 。 這是很少使用的:
int *x[] = { (int []) {1, 2, 3}, (int []) {4, 5, 6} };
這些字符串文字和復合文字之間的關鍵區別在於,字符串文字定義了在程序執行的整個生命周期內存在的對象,但是函數內部使用的復合文字具有自動存儲持續時間,它將在函數返回時消失,並且可能會更早消失,具體取決於關於它的使用位置。 新手C程序員在了解存儲期限規則之前應避免使用復合文字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.