簡體   English   中英

為什么可以將字符串分配給char *指針,而不是char []數組?

[英]Why can a string be assigned to a char* pointer, but not to a char[] array?

有人可以解釋為什么這適用於指針:

char * str1;

str1 = "Hello1";

str1 = "new string";

// but not this
char str2 [] = "hello";
str2 = "four";

// or this
char str3 [];
str3 = "hello";
str3 = "hello";

為什么它適用於指針:
當你在C中說char * str1時,你在內存中分配一個指針。 當你寫str1 = "Hello"; ,您正在內存中創建一個字符串文字並使指針指向它。 當您創建另一個字符串文字"new string"並將其分配給str1 ,您所做的只是改變指針指向的位置。

為什么它不適用於數組:
當你說char str2 [] = "Hello" ,你正在創建一個字符串文字並在定義期間將它放入數組中。 可以不給出大小,因為數組計算它並向它附加'\\0' 如果不調整大小,則無法將任何內容重新分配給該數組。 這就是為什么str2 = "four"不起作用的原因。

str3情況下,情況是相同的。 您尚未在定義中定義數組的大小,因此它將其大小計算為0.如果不調整數組大小,則無法分配任何新內容。

數組和指針是不同的東西,這就是原因。 您可以指定指針,但不能指定給數組。 使用字符串文字初始化char數組時會發生特殊異常。

char a[] = "Hello"; //initialize a char array with string literal. Special case, OK
char* p = "Hello"; //initializa a pointer with an array(which gets converted to pointer)
p = "My";   //assign pointer to point to another value. OK
a = "My";   //error, arrays cannot be assigned to. Use `strcpy`

字符串文字(例如“Hello”)具有char[N]類型,其中N是字符數(包括終止'\\0' )。 數組可以轉換為指向其第一個元素的指針,但數組和指針不是一回事,無論一些壞書或教師可能會說。

簡而言之,因為數組不是C / C ++中的第一類對象。 分配給數組的唯一方法是使用str(n)cpy或memcpy。

雖然數組在傳遞給函數時會折疊成指針,但除了在編譯時初始化之外,不能分配給數組。

這只是因為,當你編寫這段代碼時:

char str2 [] = "hello";

甚至:

int arr[] = {1,2,4,4,5};

它創建str2arr作為常量指針。 這就是為什么你不能將任何其他值重新分配給這些指針的原因,而在以后的情況下你要創建一個普通的指針,你可以為它指定任何東西。

使用指針的情況它的工作原理是因為當您指定類似str1="Hello" ,您實際上正在創建一個名為hello的字符串文字,將其分配到內存中的某個位置,並將該文字的第一個字符的地址分配給指針,以及指針不是常量,您可以使用不同的地址再次指定它。 還有一點需要注意的是,創建的字符串文字是在只讀內存中。

帶字符數組的情況您可以在初始化時為其指定字符串文字,因為該語言支持該字符串。 並且不要將賦值與初始化混淆。 在賦值時,由於它是一個字符數組,你必須逐個字符地改變值,你試圖將字符串文字的第一個地址寫入數組的第一個字符(數組的名稱返回第一個元素的地址)這顯然是不正確的,因為第一個元素不是指針,它不能存儲地址。

暫無
暫無

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

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