我正在學習指標和字串。我明白,
- 指標和陣列/字串具有相似的行為。
- 陣列[]、*陣列、&陣列[0]。他們都是一回事。
為什么此代碼中的三個陳述句有效,而char * help一個無效?
#include <stdio.h>
void display(char*help){
for(int i=0; help[i]!='\0'; i ){
printf("%c", help[i]);
}
}
int main(){
// char help[] = "Help_Me"; //Works
// char help[] = {'H','e','l','p','_','M','e','\0'}; //Works
// char *help = "Help_Me"; //Works
char *help = {'H','e','l','p','_','M','e','\0'}; //Error
display(help);
}
錯誤資訊:
警告:從 'int' 初始化 'char *' 使指標從整數變為沒有強制轉換
警告:標量初始值設定項中的元素過多
uj5u.com熱心網友回復:
陣列[]、*陣列、&陣列[0]。他們都是一回事。
不可以。假設array命名某個陣列,array[]不能在運算式中使用(除非它可能出現在某些型別描述中,例如強制轉換)。
array運算式中的自身會自動轉換為指向其第一個元素的指標,除非它是sizeofunary的運算元或運算元&。(此外,字串文字,例如"abc",表示一個陣列,并且該陣列在轉換時有另一個例外:當它用于初始化陣列時。)
在*array,array會自動轉換為指標,然后*參考它所指向的元素。因此*array指的是陣列中的一個元素;它不是指向陣列或其元素的指標。
在&array[0],array[0]指的是陣列的第一個元素,然后&取它的地址,所以&array[0]是指向陣列第一個元素的指標。這使得它等同于arrayin 運算式,除了上面提到的例外。比如void *p = array;和void *p = &array[0];會初始化p為同一個東西,一個指向陣列第一個元素的指標,因為自動轉換。但是,size_t s = sizeof array;并且size_t s = sizeof &array[0];可以初始化s為不同的值——第一個是整個陣列的大小,第二個是指標的大小。
// char help[] = "Help_Me"; //Works
help是 的陣列char,字符陣列可以用字串字面量初始化。這是初始化的特殊規則。
// char help[] = {'H','e','l','p','_','M','e','\0'}; //Works
help 是一個陣列,初始化器是陣列元素的值串列。
// char *help = "Help_Me"; //Works
help是一個指標,并且"Help_Me"是一個字串文字。因為它不在例外之一中——操作sizeof數、一元運算元&或用于初始化陣列——它會自動轉換為指向其第一個元素的指標。然后help用該指標值初始化。
char *help = {'H','e','l','p','_','M','e','\0'}; //Error
help是一個指標,但初始化器是一個值串列。只有一件事要初始化,一個指標,但有多個值列出,所以這是一個錯誤。此外,指標應該用指標值(地址或空指標常量)初始化,但該串列中的專案是整數。(字符文字是整數;它們的值是字符的代碼。)
{'H','e','l','p','_','M','e','\0'}不是創建字串或陣列的語法。它是一種語法,可用于在初始化物件時提供值串列。因此編譯器不會將其識別為字串或陣列,也不會使用它來初始化指標help。
uj5u.com熱心網友回復:
- 指標和陣列/字串具有相似的行為。
事實上,不,我不會同意這一點。這是一種隱藏重要細節的過度簡化。真實的情況是陣列幾乎沒有自己的行為,但在大多數情況下,指定陣列的左值會自動轉換為指向第一個陣列元素的指標。當然,結果指標的行為就像一個指標,這可能會表現出指標和陣列具有相似行為的外觀。
此外,陣列是物件,而字串是char陣列可以包含的某些資料配置。盡管人們有時會將字串與包含它們的陣列或指向它們的第一個元素的指標混為一談,但這在形式上并不正確。
- 陣列[]、*陣列、&陣列[0]。他們都是一回事。
不,完全不是,盡管差異取決于它們出現的背景關系:
在array(函式原型除外)的宣告中,
type array[]宣告array為一個陣列,type其大小將由其初始值設定項確定;type *array宣告array為指向type; 和&array[0]不是任何有效宣告的一部分array。
在函式原型中,
type array[]就像它一樣自動“調整”type *array,因此它宣告array為指向type;type *array宣告array為指向type; 和&array[0]不是任何有效宣告的一部分array。
在一個運算式中,
array[]是無效的;*array等價于array[0],它指定 的第一個元素array;和&array[0]是指向 的指標array[0]。
現在,你問,
為什么此代碼中的三個陳述句有效,而 char * help 一個無效?
"Help_Me"是字串文字。它指定一個靜態分配的陣列,大小剛好足以包含指定的字符和字串終止符。作為陣列值運算式,在大多數情況下,它被轉換為指向其第一個元素的指標,并且這樣的指標是用于...的正確型別。
// char *help = "Help_Me"; //Works
但是字串文字作為char陣列的初始值設定項的出現......
// char help[] = "Help_Me"; //Works
... 是陣列值不會自動轉換為指標的少數背景關系之一。在這種情況下,由字串文字指定的陣列元素用于初始化正在宣告的陣列,非常類似于 ...
// char help[] = {'H','e','l','p','_','M','e','\0'}; //Works
. 有{'H','e','l','p','_','M','e','\0'}一個陣列初始值設定項,指定 8 個陣列元素的值。請注意,作為一個整體,它本身并不是一個值,它只是一個包含八個型別int(在 C 中)或char(在 C 中)的值的語法容器。
這就是為什么這...
char *help = {'H','e','l','p','_','M','e','\0'}; //Error
……沒有意義。那里有help一個標量物件,而不是陣列或結構,所以它只需要一個值。該值的型別為char *。您的編譯器發出的警告告訴您,已經提供了八個值而不是一個,并且它們具有,或者至少用于初始化的一個具有 typeint而不是 type char *。
uj5u.com熱心網友回復:
指標不是陣列,它不能像陣列一樣初始化。您需要創建一個物件,然后您可以將其參考分配給指標。
char *help = (char[]){'H','e','l','p','_','M','e','\0'};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315022.html
下一篇:wxPython-標簽的面板尺寸
