這是否......做這些關於指針的語句有相同的效果嗎?
char* myString = "hello";
......有,因爲這同樣的效果?
char actualString[] = "hello";
char* myString = actualString;
這是否......做這些關於指針的語句有相同的效果嗎?
char* myString = "hello";
......有,因爲這同樣的效果?
char actualString[] = "hello";
char* myString = actualString;
char str1[] = "Hello world!"; //char-array on the stack; string can be changed
char* str2 = "Hello world!"; //char-array in the data-segment; it's READ-ONLY
第一個例子號創建尺寸13*sizeof(char)
的堆疊並複製串"Hello world!"
到它上的陣列中。
第二示例創建堆棧上的char*
並將其指向在可執行文件,它包含字符串"Hello world!"
的數據段的位置。第二個字符串是只讀。
str1[1] = 'u'; //Valid
str2[1] = 'u'; //Invalid - MAY crash program!
號在第一個,你不能修改通過myString
指向的字符串,第二個就可以了。閱讀更多here。
號第一個給你一個指針const
數據,如果你通過該指針被改變的任何字符,這是不確定的行爲。第二個將字符複製到一個數組中,這不是const
,因此您可以隨意更改任何字符(或者直接在數組中或通過指針),而不會產生任何不良影響。
它不一樣,因爲第一個例子中由myString
指向的未命名數組是隻讀的並且具有靜態存儲持續時間,而第二個示例中的指定數組是可寫的並具有自動存儲持續時間。
在另一方面,這是接近到等價:
static const char actualString[] = "hello";
char* myString = (char *)actualString;
它仍然是不完全一樣,但因爲通過字符串文字創造的無名數組不保證是唯一的,而明確數組是。因此,在下面的例子:
static const char string_a[] = "hello";
static const char string_b[] = "hello";
const char *ptr_a = string_a;
const char *ptr_b = string_b;
const char *ptr_c = "hello";
const char *ptr_d = "hello";
ptr_a
和ptr_b
被保證比較不等,而ptr_c
和ptr_d
可以是相等或不相等 - 兩者都是有效的。
它看起來像你可以很容易地編譯和測試代碼......你爲什麼不考呢? – 2010-01-19 19:35:12
這已經被問了一噸!〜 – JonH 2010-01-19 19:35:48
他並不是問它是工作還是編譯。他問是否兩個陳述具有相同的效果(也就是以相同的方式工作)。答案是否定的。 – 2010-01-19 19:36:22