您好,登錄后才能下訂單哦!
本篇內容介紹了“C++字符數組與字符指針在運算時的區別是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
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++操作。
“C++字符數組與字符指針在運算時的區別是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。