簡體   English   中英

為什么我們不能將2D整數數組初始化為指針?

[英]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 這些事物中的每一個本身都是一組(由三個事物組成)。 但是, xint *的數組。 x每個成員都應使用指針進行初始化。 但是{1,2,3}三件事情不是一個指針。

初始化數組和結構時,用於解釋事物組的C規則有點復雜,因為它們旨在為省略括號提供一定的靈活性,因此我必須多研究一些標准以解釋它們在此處的應用。 可以說編譯器將聲明解釋為使用1初始化x[0] 由於1是一個intx[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.

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