C 字元陣列與字元指標在運算時的區別

2021-09-11 00:17:03 字數 1478 閱讀 1177

char *strptr = 「hello 「;

char str = 「hello 「;

*(strptr + 1) = 『b』; // 出錯

*(str + 1) = 『b』; // 正常執行

原因分析如下:

「hello」在記憶體中的儲存形式:

指標變數strptr在記憶體中的儲存形式:(前面是記憶體的位址)

冒號前面是記憶體的位址,後面存放的是具體內容。可以看出指標變數儲存的是"hello 「的第乙個字母的記憶體位址。

str陣列在記憶體中的儲存形式:

冒號前面是記憶體的位址,後面存放的是具體內容。可以看出字元陣列中的每個元素儲存的是"hello 「的每個字母的記憶體位址。

1,printf(」%xd\n」, &strptr); // 輸出結果為:0x00c17bf0

2,printf(」%xd\n」, strptr); // 輸出結果為:0x00907bf0

3,printf(」%xd\n」, &str); // 輸出結果為:0x001ba9f0

4,printf("%xd\n", str); // 輸出結果為:0x001ba9f0

上述1和2中輸出的結果不同是因為strptr是乙個變數,變數名作為表示式時實際是取這個變數中所訪問的值。所以1是輸出strptr這個變數的位址,而2是輸出strptr這個變數訪問的值。而3和4輸出的結果相同是因為str只是陣列名稱並不是乙個變數。而陣列名稱作為表示式時表示的就是這個陣列第乙個元素的位址。而&str表示的是整個陣列在記憶體中占用的位址。它是乙個指標陣列,即char (*strarray)[6] = &str;strarray中的每個元素訪問的值就是str這個陣列各個元素的記憶體位址。這裡輸出時由於沒有指定輸出哪個元素,所以預設輸出了strarray的第乙個元素。因此它與4的輸出結果相同。

從上可以看出,對陣列str進行的運算實際是對其自身的記憶體位址進行的運算。即str+1實際是獲取了str這個陣列的第2個元素的位址,而不是這個資料的第2個元素所訪問的位址。獲取的結果為0x001ba9f1。而對指標strptr進行的運算實際是對其所儲存的記憶體位址進行的運算。即strptr+1實際是獲取的其儲存的記憶體位址進行加1。獲取的結果為0x00907bf1。所以,*(str + 1) = 『b』;操作實際只是改變了0x001ba9f這個位址中所訪問的

值,而*(strptr + 1) = 『b』;則是要改變0x00907bf1這個位址中所訪問的值。而0x00907bf1這個位址中訪問的是字面量的值,即常量的值,是不允許修改的。所以,執行*(strptr + 1) = 『b』;操作時會出錯。

陣列名str代表的是陣列的首位址,是乙個常量,所以對其進行str++會出錯。因為不能改變乙個常量的值。而指標strptr是乙個變數,所以可以進行strptr++操作。

字元陣列與字元指標

10.4 指標與字串 10.4.1 字元陣列與字元指標 在第八章中我們已經詳細討論了字元陣列與字串,字元指標也可以指向乙個字串。我們可以用字串常量對字元指標進行初始化。例如,有說明語句 char str this is a string.是對字元指標進行初始化。此時,字元指標指向的是乙個字串常量的首...

字元指標與字元陣列

1.字元指標可以指向乙個字串。我們可以用字串常量對字元指標進行初始化。例如,有說明語句 char str this is a string.是對字元指標進行初始化。此時,字元指標指向的是乙個字串常量的首位址,即指向字串的首位址。這裡要注意字元指標與字元陣列之間的區別。例如,有說明語句 char st...

字元陣列與字元指標

節選了一些有價值和易錯的部分。char str this is a string.char string this is a string.字元指標str與字元陣列string的區別是 str是乙個變數,可以改變str使它指向不同的字串 但不能改變str所指的字串常量 string是乙個陣列,可以改...