關於字符串指針不可修改的問題


C/C++ code

char * m = " hello " ; * (m + 1 ) = ' s ' ; for (; * m != ' \0 ' ;m ++ ){ printf( " %c\n " , * m); }


但是出運行時錯誤。
----------------------------------------------------------
我用數組下標的方式是可以修改的:

C/C++ code
int i = 0 ; char w[] = " hello " ; w[ 1 ] = ' s ' ; while (w[i] != ' \0 ' ){ printf( " %c\n " ,w[i]); i ++ ; }
 
 
 
答復一:
char *m = "hello";
"hello"保存在靜態數據區,該數據不能修改.
由指針m指向. 不能通過指針m來修改靜態數據區的值.

char w[] = "hello";
"hello"保存在棧空間數組里. 數組名為w, 函數名為數組的首地址.
可以通過w[i]='a', 或*(w+i)='a'的形式來修改數組內容.
 
疑問:
這種說法是錯誤的。如下:
 static int a = 10;
 int *b = &a;
 *b = 20;
 cout<<a<<endl;
輸出結果為20.我們依然通過指針修改了存儲在靜態存儲區里的數據源。
 
//---------------------------------------------------
答復二:
 
字符串“hello”本身就是一個常量字符指針,而對於指針m,無非就是一個地址的拷貝,也就是“hello”地址的拷貝,相當於m指向一個字符串常量,字符串常量是不予許改變的!

而對於w[]來說就不一樣了,雖然hello本身是常量,不過此時拷貝給w[]的不是地址,而是內容,也就是“hello”,也就是w本身擁有一個自己的hello副本,可以對其進行想要的合法操作,比如改變等!!
 
 
回復三:
char *m = "hello";
"hello"保存在文字常量區,該數據不能修改,默認有只讀屬性.
由指針m指向. 不能通過指針m來修改此值.

char w[] = "hello";
"hello"保存在棧空間數組里. 數組名為w, 函數名為數組的首地址.
可以通過w[i]='a', 或*(w+i)='a'的形式來修改數組內容.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM