c語言用指標方式定義的字串為什麼不能修改

2021-10-10 19:47:31 字數 5017 閱讀 1080

1樓:匿名使用者

"123"本身預設的就是一個字串常量,他的值不容修改,p只是一個指標,執行該字串的首地址,對該地址的值指向的地址空間的值的改變也是不允許的。

2樓:匿名使用者

我也是今天在想這個宣告模式跟char p [ ]="123";之間的區別時琢磨的。二維陣列int a [ i ] [ j ],當把二維陣列看成一維陣列時宣告指標變數是這樣宣告的:int *p=a[ i ],這個時候p指向的是元素型別為int型的一維陣列的第一個元素;當以指標方式定義字串的時候,同樣的道理,指標p指向的是元素型別為字元陣列的陣列(大致如:

a[ 0 ][ 0 ]=},p=a[ 0 ]),此時p指向元素「123」的第一個元素『 1 』。當以*p=『0』這種方式賦值的時候相當於把char型別的值賦值給陣列型別的變數!不知道說的夠不夠明白,第一次回答問題;碰巧我也在研究這個問題,搜了之後點進來發現你的問題跟我一樣。

只是自己的一點未經別人證實的想法。但至少讓我不在這個問題上糾結。。。

3樓:

我的天啊!

char * p = "123";這是字串型別的然而*p = '0';//這樣會出錯

你直接負一個字元給他,當然報錯

c語言中,為什麼不能對字元指標變數指向的字串再賦值?

4樓:大野瘦子

因為抄c語言中,凡是以""括住的形式直接出襲現,而且你又沒有為其分配記憶體空間的字串都是常量字串,是不能修改其值的。

這樣:char a[6]="hello";

a[2]='c';

就可以了。

這裡你為hello分配了一個長度為6的字元陣列空間來存放。

5樓:種令芮德曜

char*

a=為什麼不能修改,這個要涉及程序佔用的記憶體分段,大概分為**區,只讀

區,全域性區專,堆屬區,棧區。"hello"作為一個字串字面值,是被放在只讀區,只讀顧名思義就是不能修改的。char*

a="hello",相當於把hello的地址賦給了a,故而不能對a指向的內容進行修改。char

a="hello",這樣賦值的就是一個字元陣列。字元陣列a是在棧區裡申請的一個空間給a,然後把只讀區的"hello"進行了一次複製再賦值給a,這樣a的指向是能修改的。

6樓:匿名使用者

c primer plus 一書中寫到:「內容」為字串面量,其被視為常量,故無法再進行修改。只能對其指標的值(改變位置)進行修改,不能改變其內容。

7樓:

這不是絕對的:

bai當指du

針指向的字串是zhi常字串時當然不能再賦dao值,因為目標是「常量專」,而當指標

屬指向的字串不是常字串時就可以再賦值,比如用動態申請記憶體方法建立的字串。具體說就是用char *p="abcqer12345";這種方法定義字串是不能通過指標改變內容的,原因是這個定義確定了abcqer12345是字串常量——因為char *p="abcqer12345";被編譯器解釋為「建立一個字串常量abcqer12345,並把它的首地址(就是a的地址)賦給char *型指標p」——既然是「常量」,自然就不能更改。

8樓:匿名使用者

c語言bai中,凡是以""括住的形式直du接出現,而且你zhi又沒有為其分配內dao

存空間的字

符串專都是常量字串,是屬不能修改其值的。

char a[6]="hello";

a[2]='c';

就可以了。這裡你為hello分配了一個長度為6的字元陣列空間來存放。

9樓:匿名使用者

char *a="hello";

''hello''是常量,所以a指向的是常量區,不能對於常量區的元素進行賦值

10樓:匿名使用者

char *a="hello";這個形式的定義是屬於字串常量,不可以修改的.

11樓:匿名使用者

不能修改!

char *p="hello";

相當於 const char *p="hello"

以這種方法初始化的字串是常量字串,而系統預設對常量賦初值後,其值無法被修改,否則會報錯,所以不能修改。

c語言裡為什麼字元指標變數指向的字串常量中的內容是不可取代的?

12樓:風若遠去何人留

其本質就是常量值不可修改。

c語言中定義為常量的值,是不允許被修改的,這是一個規則。如果有修改需求,就不要定義為常量,而是定義為變數。

在執行時,常量字串會被儲存於特定的常量空間,這段空間的特性就是隻讀的,任何修改操作,均會引起整個程式崩潰。這也是c語言保證常量不可修改的一個手段。

13樓:潘達

const宣告的是常量所在的段是隻讀的,程式不是所有地方都能改的,是有許可權的,只讀的儲存區是不能寫操作的,你只要寫,就係統一定彈出異常資訊,告訴你是隻讀的,操作無效,如果你想改就別宣告稱常量,當然你也有改的辦法,去exe檔案裡改吧,只要你能找到地方。。。。

14樓:

指向字串常量的話,這段常量字串是儲存在靜態儲存區的,內容不能修改。

當然你可以讓指標指到別的地方

15樓:

系統記憶體會劃分如下區域:常量資料區、棧區、自由儲存區、堆區 、全域性/靜態區,其中常量存放在常量資料區,這個區域是隻讀的,用指標也無法改變這塊區域的內容。

16樓:尼瑪真響亮

您說的是類似這種把:char *a = "abcdefg"; ?

如果重新賦值,lz可以用陣列來做,char a = "abcdefg";

17樓:ai看雪

常量就是常量,不是變數,不能改變

c語言中用指標賦值字串為什麼不加*,如下

18樓:匿名使用者

a="cool";

這是地址來賦值,將一個常量字串

自的首地址賦值給a這個指標。

*a="cool";

這是字元賦值,不是字串!雖然a叫字串指標,但char* a這樣的定義,*a必然是一個字元,而不是多個。因此後面的常量會被忽略為一個字元,進行數值賦值(也可以理解為拷貝賦值,區別於地址賦值)。

在a沒有分配地址的情況下,直接 *a=「***」 會造成記憶體報錯,而a=則不會。

為什麼c語言用指標輸出字串不用加*號

19樓:聽不清啊

printf在輸出字串時,需要的是指向字串的門地址。而str就是它所需要的這樣一個首地址。

20樓:嵩山少俠來了

為什麼c語言用指標輸出字串不用加*號?因為char*str定義了一個char*字元指標str,而str指向了ilovechina中的第一個字元i。

在cout流中有一個複製迴圈,它是一個具有數百個輸出str點的字串,在這個字串中,str被賦值給臨時指標,以便一個接一個地輸出。

然後*str是一個字元,也就是i*是一個derecration,也就是str指向的那個字元,所以*str就是i這個不能被賦值或移位所以它不能被列印出來。

擴充套件資料:

關於字串指標

1.字元陣列中儲存一個度字串

char字串[]="linuxc";

printf("%s\n",字串);

字串是一個字元陣列的名稱,它也是應答字元陣列的第一個地址。

2.使用字串指標指向一個字串

如果你不想定義一個字元陣列,你可以用一個指標指向一個字串,稱為「字串指標」,例如:

char*p="linuxc";

printf(「%s\n」,p);

「linuxc」是一個字串常量。字串常量的c語言:在記憶體中開啟一個字元陣列來儲存字串常量,並將開啟的字元陣列的第一個地址儲存到p。

c語言 指標 直接字串變數前加*是什麼怎麼回事?沒有提前定義啊

21樓:因為_遺忘

你是說fun函式的那個引數char *a 嗎?

用在這裡表示fun函式呼叫時需要的引數是一個char型別的指標,也就是地址,這裡可以理解為這是一個定義,定義一個char型別的區域性指標變數,如main函式裡面呼叫時,fun(s)將字串的初始地址傳入fun函式。

22樓:隨便玩玩

void fun(char * a)

子函式裡面不是定義了嗎?為什麼說沒有定義?不理解你的意思a就是一個*a這個指標指向的地址呀

fun(s); //這是把字元陣列s[80]的地址傳給子函式並通過子函式進行運算,這裡的子函式什麼也沒有幹,就是一個空函式

這個程式輸入什麼字串,就輸入什麼字串。和那個子函式沒有關係,只是讓你明白,函式的引數傳遞可以傳遞一個地址而已。

以上為個人見解,如有不對之處,歡迎大神指正!

23樓:真的無奈啊

加了*就表示這是指標(就是這個變數的儲存地址

,這是個char(字元)指標,就是隻能儲存字元類變數的地址)!這道題是傳址呼叫, fun(s);就是把s[80]中的字串的首地址傳給形參a(這裡a是字元型指標),之所以這樣寫,是為了讓實參隨著形參變而變!c語言:

傳值呼叫實參不能隨著形參改變而改變,只有傳址(地址)呼叫才能讓實參隨著形參改變而變!在c++裡面和這差不多,但是c++裡面引用也能讓實參不能隨著形參改變而改變!

24樓:匿名使用者

是指「void fun(char * a)」這裡嗎?

這樣定義是很正常的,基本上子函式的形參都這樣定義

處理陣列類的函式形參用指標比較方便,陣列名即為陣列首地址,傳遞首地址,即傳遞整個陣列,因為陣列在記憶體中是連續儲存的。不會出現斷點

25樓:家高韻冼姝

ps指向"thisisa

book"的首地址,即第一個元素,但是指標有一個運算

跪求c語言字串處理函式,跪求 c語言字串 7個處理函式

1.字串連線函式 strcat 原型 char strcat char str1,const char str2 2.字串查詢函式 strchr 原型 char strchr const char str1,const char str2 3.字串比較函式 strcmp 原型 int strcmp ...

用c輸入字串,用空格方式區分不同字串通過字串切割,最終以特定方式輸出

string x 用c 輸入 字串 用空格方 式區分不同 string y x.split stringarr str.split 需要空格,不是字元,加個空格才是空字元 c 從鍵盤輸入一串字元,寫出程式用字串處理方法將字串變為一個陣列.這是用正則按空格分離字串的,存入到spli陣列中,希望對你有所...

c為字串陣列動態賦值的問題,C 為字串陣列動態賦值的問題

改用list吧.方法一是沒有new 沒有分配空間 方法二是在new的時候沒有指定大小,預設是0個元素,所以對其任意一個元素賦值都是越界.在c 中,陣列一般用來存放大小確定的資料.如果陣列大小未知,建議使用list lista new list a.add we messagebox.show a 0...