![](/img/trans.png)
[英]Why can´t we assign a new string to an char array, but to a pointer?
[英]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};
它創建str2
或arr
作為常量指針。 這就是為什么你不能將任何其他值重新分配給這些指針的原因,而在以后的情況下你要創建一個普通的指針,你可以為它指定任何東西。
使用指針的情況它的工作原理是因為當您指定類似str1="Hello"
,您實際上正在創建一個名為hello的字符串文字,將其分配到內存中的某個位置,並將該文字的第一個字符的地址分配給指針,以及指針不是常量,您可以使用不同的地址再次指定它。 還有一點需要注意的是,創建的字符串文字是在只讀內存中。
帶字符數組的情況您可以在初始化時為其指定字符串文字,因為該語言支持該字符串。 並且不要將賦值與初始化混淆。 在賦值時,由於它是一個字符數組,你必須逐個字符地改變值,你試圖將字符串文字的第一個地址寫入數組的第一個字符(數組的名稱返回第一個元素的地址)這顯然是不正確的,因為第一個元素不是指針,它不能存儲地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.