我正在研究指標,這就是我學到的:-
int a = 23;
int *ptr = &a;
char b = 'b';
char *pnt = &b;
char *str = "string";
分配給指標的值是地址。所以我不能做int *ptr = 7;或char *k = 'c';。但我可以這樣做char *str = "string";,因為“字串”不是一個字符,而是一些字符值的陣列,因為字符和指標彼此非常相似,所以在上面的代碼中,如果我列印printf("%p", str);應該列印保存在 str 中的地址,它應該是字串的起始地址(這是我想知道我是對還是錯的第一部分)
所以以另一種方式,char *str = "string";我只是在創建一個字符陣列,例如{'s','t','r','i','n','g'}. (也許這聽起來很愚蠢,但事實就是如此)所以我想為什么不嘗試一下char *str = {'s','t','r','i','n','g'};,我認為這printf("%p\n", str)將再次給出字串的起始地址,但是在得到一些奇怪的值并運行printf("%c", str)回傳的 's' 之后,我發現它給出了陣列的第一個元素而不是地址。我對 int array 進行了同樣的嘗試,并注意到一個警告說
int *array = {1,2,3};
警告:從 'int' 初始化 'int *' 使指標從整數而不進行強制轉換
根據我對此的理解,編譯器將 {1,2,3} 視為 int 而不是陣列,我不知道為什么,但如果我明確地轉換它運行良好,就像int *array = (int[]){1,2,3}. 我不知道為什么我需要明確地告訴但我認為這就是編譯器看到它的方式
- 編譯后
int *array = {1,2,3};得到地址 {1,2,3}。 - 但是當編譯器看到該地址有一個 int 時,它只讀取該 int
- 編譯器認為它
int *array = 1不像int *array = {1,2,3}
我不知道我的理論是否正確。如果不是,請我想知道為什么會發生這種情況以及為什么char *str = "string"不需要任何演員表。
uj5u.com熱心網友回復:
在 C 中,字串文字具有字符陣列型別。例如,字串文字"string"作為以下型別的陣列存盤在記憶體中char[7]:
{ 's', 't', 'r', 'i', 'n', 'g', '\0' }
您可以使用以下呼叫來檢查這一點
printf( "sizeof( \"string\" ) = %zu\n", sizeof( "string" ) );
運算式中使用的陣列(極少例外)被隱式轉換為指向其第一個元素的指標。
來自 C 標準(6.3.2.1 左值、陣列和函式指示符)
3 除非它是 sizeof 運算子或一元 & 運算子的運算元,或者是用于初始化陣列的字串字面量,否則型別為 ''array of type'' 的運算式將轉換為型別為 ''pointer 的運算式鍵入指向陣列物件的初始元素且不是左值的''。如果陣列物件具有暫存器存盤類,則行為未定義
所以在這個宣告中
char *str = "string";
對應于編譯器存盤的字串文字的陣列(通常在字串文字池中)被轉換為指向其第一個元素的指標,并將指標的值分配給標量物件str。
str不是陣列。str是一個指標。
上面的宣告也可以用以下方式重寫
char *str = &"string"[0];
本宣告
char *str = {'s','t','r','i','n','g'};
是不正確的。標量物件可以由僅包含一個賦值運算式的花括號串列初始化。
來自 C 標準(6.7.9 初始化)
11 標量的初始值設定項應為單個運算式,可選擇用大括號括起來。物件的初始值是運算式的初始值(轉換后);應用與簡單賦值相同的型別約束和轉換,將標量的型別作為其宣告型別的非限定版本。
你可以寫例如
char *str = { ( 's','t','r','i','n','g' )};
在這種情況下,大括號內有一個帶有逗號運算子的主運算式。實際上這個宣告等價于
char *str = { 'g' };
and the compiler will issue a message that you are trying to initialize a pointer with an integer.
In this declaration
int *array = (int[]){1,2,3};
there is no casting. The construction (int[]){1,2,3} denotes a compound literal of the type int[3] and again the address of the first element of this array is assigned to the pointer array.
You may imagine the above declaration the following way
int compound_literal[] = { 1, 2, 3 };
int *array = compound_literal;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/442973.html
上一篇:更改結構中元素的值
