簡體   English   中英

將字符串分配給指針數組

[英]Assign string to the pointer array

我可以知道為什么當我聲明一個指針數組時

char *suits[]={"abc","cab","bca"}

即使我分配一個字符串而不是指針地址也沒有錯誤? 因為從我學到的知識來看,該指針只能由地址(&)或另一個指針(*)分配。 更令人費解的是當我打印出指針數組時

cout<<suits[1]; 

我得到了字符串“ cab”,而不是地址,即使我沒有使用取消引用運算符。 當我使用解引用運算符時

cout<<*suits[1];

我只有'c'。

總結一下問題是:1)為什么我可以將字符串分配給char類型的指針而不是地址或指針,以及2)為什么當我打印出char類型的指針而不是給我地址時卻顯示字符串。 3)最后,為什么當我取消引用char類型指針時,它會給我字符串中第一個char的值。

真的想知道為什么char類型的指針與其他指針如此不同嗎?

根據C ++標准

4.2數組到指針的轉換[conv.array]

1可以將“ NT數組”或“ T的未知邊界數組”類型的左值或右值轉換為“指向T的指針”類型的prvalue。 結果是一個指向數組第一個元素的指針。

在此聲明中

char *suits[]={"abc","cab","bca"}

所有字符串文字的類型都為const char[4]並且基於這些字符串文字的初始化程序表達式將轉換為指向字符串文字的第一個元素的指針。 在C ++中,它們的類型為const char * 因此,像這樣聲明數組會更正確

const char *suits[]={"abc","cab","bca"}

對於指向char的指針, operator <<被顯式重載,並執行指針所指向的輸出字符,直到遇到零終止字符為止。 假設如果在運算符<<中使用指向char的指針,則將輸出此指針指向的字符串。

至於這個記錄

cout << * suits [1];

然后根據suits的定義為指針數組,suits [1]是數組的第二個元素,並且是指向字符串文字“ cab”的第一個元素的指針。 因此,取消引用指針后,您將獲得字符串文字的第一個元素,即字符'c'。

您似乎對C中的字符串感到困惑。

字符串是一個字符數組,最后一個字符為'\\0'

如果您在任何地方的源代碼中都寫入"abc" ,那么編譯器將為您創建一個數組,就像您已聲明了全局變量一樣:

char abc_string[4] = {'a', 'b', 'c', '\0'};

(盡管實際上不會被稱為abc_string )。

與“ cab”和“ bca”相同。

然后,您的定義與此等效:

char *suits[]={abc_string, cab_string, bca_string};
// where abc_string, cab_string and bca_string are the arrays created by the compiler.

現在,當您在C中使用數組名稱時,大多數情況下會自動將其轉換(“衰減”)為指向其第一個元素的指針。 因此,在上面的定義中, abc_string實際上意味着&abc_string[0] -指向abc_string的第一個元素的abc_string

char *suits[] = {&abc_string[0], &cab_string[0], &bca_string[0]};

現在應該很清楚, suits元素所指向的是什么—它們指向每個字符串的第一個字符。

這不是特定於數組的-如果您編寫:

char *thing = "hello world";

然后編譯器會生成一個包含{'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\\0'}的數組{'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\\0'} ,並將thing設置為指向其第一個元素。

暫無
暫無

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

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