定義為int的陣列怎么可能存盤字串值?看看代碼,arri[]被定義為一個整數,但卻存盤著字串值?而且定義為字符的陣列也在存盤整數值。這怎么可能呢?
int main(void) {
int arri[] = {'1'/span> , '2', 'a'};
int *ptri = arri;
char arrc[] = {11, 21 , 31 };
char *ptrc = arrc;
printf("%d" , *arri) 。
printf("%d" , *ptri) 。
printf("%d" , *arrc ) 。
printf("%d" , *ptrc) 。
return 0;
}
uj5u.com熱心網友回復:
定義為int的陣列如何存盤字串值?
在你提供的代碼片段中沒有字串。
在這個宣告中
int arri[] = {'1'/span> , '2'/span>, 'a'/span>};
代表型別為int的整數字符常量的初始化器被用來初始化陣列的元素。這些字符常量在內部被存盤為它們的代碼。例如,在ASCII字符表中,整數字符常數在內部有相應的值49、50和97。
下面是一個演示程式
程式輸出是
'1' = 49 '2' = 50 'a' = 97
當使用轉換指定符%c時,函式printf試圖將它們輸出為(圖形)符號。
請注意,當轉換指定符%d被用來輸出char型別的物件時,就會執行整數提升,將char型別的物件提升為int型別的表達。
在這個宣告中
char arrc[] = {11, 21 , 31 };
整數常量的值符合可以存盤在char型別物件中的值范圍。
在這兩種情況下,沒有截斷或溢位。
uj5u.com熱心網友回復:
首先要明確的是,不要在計算機內的任何地方實際存盤一個像'a'這樣的字符。你實際上存盤了一個數字。對于'a',這個數字是十進制的97。計算機本身不知道這是一個'a'。計算機只看到它是一個數字。只有當你把這個數字發送到一個期待字符的設備(例如終端、列印機等)時,一些設備驅動程式才會把這個數字改為顯示字符'a'。
參見https://en.wikipedia.org/wiki/ASCII以了解字符和數字之間的映射關系。
C標準允許你使用字符,就像它們是數字一樣。編譯器會自動將字符轉換為相應的數字。因此
int x = 'a'。
這與
完全相同int x = 97;
和你的行
int arri[] = {'1' , '2', 'a'};
與
相同int arri[] = {49 , 50, 97};
正如已經提到的,型別char只是存盤數字--就像型別int。區別僅僅在于可以存盤的數字范圍。通常,一個char是1個位元組的記憶體,而int是4個位元組(但這取決于系統)。
所以這個代碼
char arrc[] = {11, 21 , 31 };
簡單地存盤這3個十進制數字。通常情況下,每個數字使用1個位元組。
有趣的是這一行:
printf("%d"/span> , *arrc ) 。
這里*arrc是存盤在1個位元組中的數字11(通常)。那么如何使用%d來列印它呢,因為它期望一個int?
答案是 "默認引數促銷"。對于變數函式(如printf),這意味著比int"小 "的整數型別應在函式呼叫前被轉換為int。請注意,char被認為是一個整數型別,所以這也適用于char。
所以在你的例子中,存盤在char中的數字11(1位元組)將自動轉換為存盤在int中的數字11(4位元組)。因此,printf函式將收到一個int,并能夠列印成這樣。
uj5u.com熱心網友回復:
在陳述句中
int foo = 3.14159;
double值被自動轉換為int(至3)[隱式轉換]。沒有任何東西禁止這種轉換,所以分配("將double轉換為int")是可以的。
和你的例子一樣
char foo = 65; //int的值被隱式轉換為char型別。
char bar[] = { 66, 67, 0 }; //3次轉換ok。
char baz = 20210914; //可能錯誤地從int轉換到char。
//在這種情況下,編譯器可能會警告你。
//20210914超出了char的范圍,所以從技術上講,這是一個UB。
注意,
int a = 'b'。
上面的'b'是一個int型別的值,所以確實沒有轉換。
char b = 'c'; // implicit conversion from int to char ok
int c = b; // implicit conversion from char to int ok
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/315426.html
標籤:
