本篇內容介紹了“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++字符數組與字符指針在運算時的區別是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注創新互聯網站,小編將為大家輸出更多高質量的實用文章!
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。