簡體   English   中英

將char指針初始化為字符串,將其他類型指針初始化為數組

[英]initializing char pointer as string vs other type pointers as arrays

我有一個關於初始化char指針和其他數據類型指針的問題。 具體來說,我們可以按如下方式初始化char指針:

char *char_ptr = "Hello World";

據我所知,字符串唯一特別之處在於它是一個'0'終止的字符數組。 但是,我們不允許執行以下操作:

int *int_ptr = {1,2,3,4};

但我們必須這樣做:

int int_arr[] = {1,2,3,4};
int_ptr = int_arr;

為了讓int_ptr指向int_array的第一個元素。

在char情況下,我們沒有在讓char_ptr指向字符串之前將字符串“Hello World”顯式定義為char數組,而是使用字符串“Hello World”直接初始化char_ptr。

我的問題是,為什么會這樣,有什么特別的字符串允許我們這樣做,但不能與其他類型這樣做?

提前致謝,

斯利拉姆

對於使用復合文字的其他類型,您可以在C99或更高版本中執行相同的操作:

#include <stdio.h>

int main(void) {
    int *ptr = (int[]){ 1, 2, 3, 4 };
    for(int i = 0; i < 4; ++i) {
        printf("%d: %d\n",i, ptr[i]);
    }
    return 0;
}

復合文字(int[]){ 1, 2, 3, 4 }創建一個未命名的int[4] ,就像"Hello"創建一個未命名的char[6]

從C99開始, char只提供更方便的語法。

答案是:

字符串(文字)被視為特殊字符串。

相信它! 接受它,並與它一起生活。

這是因為字符串的使用非常多,以至於可以更容易地定義它們。 這比每次明確地創建一個字符數組更容易。

"Hello World"是一個字符串文字。 它具有類型“12 const char數組”和靜態存儲持續時間。 也就是說,它會在內存中為您提供一個持續一段時間的數組。 它有12個char ,因為空字符,你正確地指出的。 現在讓我們考慮兩種情況。

使用const char *char_ptr = "Hello World"; 您依賴的事實是數組可以轉換為指向其第一個元素的指針。 所以你的char_ptr指向文字所代表的靜態數據的第一個元素。

使用const char char_arr[] = "Hello World"; ,會發生什么是初始化字符數組的特殊規則。 你得到的是char_arr ,它的類型是“12個const char數組”,但靜態字符串數據中的字符用於初始化數組中的每個元素(§8.5.2)。 這意味着,您的數組char_arr是靜態字符串數據的副本。

當我們做int *int_ptr = {1,2,3,4}; 我們收到一個錯誤。 為什么? 因為{1, 2, 3, 4}不像上面的字符串文字。 {1, 2, 3, 4}是初始化器,而不是文字。 實際上,它是一個初始化列表 ,只能用於初始化事物。 這不是文字。 它不創建一些靜態數組與值123 ,和4中,然后給你的指針。 它只是用於直接初始化數組。 那么你的int_ptr指向什么? 該數組不存在於任何指向它的位置。

但是, int int_arr[] = {1,2,3,4}; 是正確使用此初始化列表。 你得到一個數組int_arr ,其中每個元素都初始化為初始化列表中的元素。

設置char * char_ptr =“Hello World”時,將字符串文字的地址設置為char_ptr。 但是,在其他數據類型的情況下,沒有什么類似於字符串文字。 所以,這是不允許的。

暫無
暫無

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

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