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

時間 2021-10-14 23:46:12

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語言不是允許字串指標先定義後賦值的嗎,求指點使用strcpy函式後有什麼區別

風若遠去何人留 是允許先定義後賦值的 不過 從下面這幾個看 其實嚴格來說 只有a是對的。bcd三個都有問題。astring2是新的值,賦值給s1 這個完全沒有問題,b s4指向的是常量字串,這個是常量區的,不允許修改,出現賦值,直接會導致程式崩潰 c s3只是定義了字元指標,沒有分配空間。對s3賦值...

c語言怎麼定義字串變數翱,c語言怎麼定義字串變數啊?

c沒有字串定義,字串是拆開放入char陣列裡面的 戚文柏 char buffer 使用指標最好.buffer char malloc 1024 strcpy buffer,1234567890 free buffer buffer null 小斬 字元陣列 求採納為滿意回答。 菜鳥學c加加 incl...

c語言刪除字串中指定字元,C語言刪除字串中指定字元

加百列 一 問題描述 從鍵盤輸入一個字串給str和一個字元給c,刪除str中的所有字元c並輸出刪除後的字串str。1 輸入 第一行是一個字串 第二行是一個字元。2 輸出 刪除指定字元後的字串。二 設計思路 1 同插入問題,定義兩個字元陣列a,b。以及標誌刪除位置的int型pos。2 用gets函式輸...