C中為什麼不能用賦值語句將字串常量直接賦給字元陣列

2021-04-20 19:03:47 字數 4423 閱讀 2618

1樓:木葉的呼息

規定不bai能整體引用

du,只能單個引用

賦值除了按字串zhi

輸入賦給字dao符陣列,或者初始化專為字串外,一般屬只能單個元素賦值

陣列名是一個地址常量,不允許改變,但是陣列中的元素是變數,可以改變賦值(陣列名這個地址[常量]就是元素[變數]的存放位置)

a是一個常量,但是a[0]是一個變數

c語言中將字串賦值給字元陣列的問題

2樓:大野瘦子

char s[20];s="helo";這樣錯誤的原因就是:不能用賦值語句將一個字串常量直接給一個字元陣列賦值。

char s[20];

char ss="hello";

s=ss;錯誤原因是:不能用賦值語句將一個字元陣列直接給一個字元陣列賦值

,即字串的複製(c語言中,但是在c++的string 類,上面的賦值是正確的)必須用strcpy()函式實現。

而char a[ ]=」toyou「;正確的原因是:因為在宣告陣列變數的時候就是,為其開闢空間,併為其初始化,這樣才是符合c語言語法的。

c語言中字串賦值的理解

一、指標式賦值

上面的示例是顯然可以正常執行的,也是很容易理解的。但是下面這種方式就令人有點難以理解了。

通過程式的運**況,我們可以知道:char *p = "hello";這種字串的賦值方式是完全沒有問題的。要理解這種賦值方式,我們首先得理解雙引號(特別注意:

這個是雙引號,不要賦值的時候給弄了個單引號)在這個語句中做了什麼工作。雙引號主要做了3個工作,分別是:

(1)申請了空間(在常量區),存放了字串。

(2)在字串尾加上了「\0」。

(3)返回地址。

這裡所返回的地址就賦值給了char *型別的指標變數p。

二、通過字元陣列直接把字串賦值。程式如下:

三、需要注意的一些問題

直接把字串賦值給陣列名(也就是陣列首元素的首地址)是不行的。

3樓:

char a ="toyou";

這才是對的,要用雙引號。

這種方式叫初始化,是可以的,"toyou"這個字串放在資料區裡,在編譯階段就確定了。

a作為陣列名,它是一個常指標,不能改變所指向的地址,只能是&a[0]所以你在非宣告的地方用a="***",就相當於改變了常量的值,是不允許的。

4樓:

#include

int main()

5樓:豬頭或火寶寶

你好!!!

舉例如下:

char s[20];s="helo";這樣是錯誤的,原因就是不能用賦值語句將一個字串常量直接給一個字元陣列賦值。

char s[20];

char ss="hello";

s=ss;這也是錯誤的,原因是不能用賦值語句將一個字元陣列直接給一個字元陣列賦值

即字串的複製(c語言中,但是在c++的string 類,上面的賦值是正確的)必須用strcpy()函式實現。

而char a[ ]=」toyou「;為上面是正確呢???那是因為我們在宣告陣列變數的時候就是,為其開闢空間,併為其初始化,這樣才是符合c語言語法的。而上面的都是不符合語法的。

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

6樓:大野瘦子

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

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

a[2]='c';

就可以了。

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

7樓:種令芮德曜

char*

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

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

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

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

8樓:匿名使用者

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

9樓:

這不是絕對的:

bai當指du

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

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

10樓:匿名使用者

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

存空間的字

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

char a[6]="hello";

a[2]='c';

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

11樓:匿名使用者

char *a="hello";

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

12樓:匿名使用者

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

13樓:匿名使用者

不能修改!

char *p="hello";

相當於 const char *p="hello"

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

c語言中,為什麼字串可以賦值給字元指標變數

14樓:匿名使用者

在c語言中並沒有bai

字串這個型別

du。所說的字zhi符串就是字元dao陣列。也就是char型別版的陣列。

與普通陣列不同的,權字串必須以'\0'作為結束符。

而在c語言中,型別為t的一維陣列,其首地址等效於該型別的一維指標,即t*型。

於是字串,也就是字元陣列,首地址就可以當做char *型使用了。

事實上,在庫函式以及大多數使用到字串作為引數的函式中,其引數都是char *型的。

15樓:路圖元

p="abcd"; //這句話的意思是把字串的首地址賦給p!

16樓:匿名使用者

單引號和雙引號,賦值的時候這個應該有講究吧!具體忘了,幾年沒去看了。

17樓:土杜土杜

p = "abcd"; 編譯器會將字串"abcd"的地址放到指標變數p中。p存放的是它的地址,不是值。

18樓:棄嬰

字串常量賦值給指標變數應該就是把它的首地址賦給指標變數吧 。

19樓:五轉故劍情深

1. 'a'是字元

常量,bai"a"是字元字面量,一個du加zhi單引號一個加雙引號,是兩個不dao同的東西不要版搞混了

2.1 字元常量'a'使用整數(字符集

權的數值碼)表示,最常用的字符集是ascii碼,在ascii碼中,字元'a'的值為97,這也是為什麼字元可以作加減法運算和比較

2.2 字串字面量"a",在c語言中作為陣列來處理,既然如此,編譯器就會把它看作是char *型別的指標。題幹中p = "abcd"其實是將"abcd"首個字母的地址賦值給了字元指標變數p,或者說p指向了字串字面量"abcd"的第一個字元

2.2.1 c語言編譯器處理長度為n的字串字面量時,會為其分配長度為n+1的記憶體空間,第n+1個位置存放額外追加的空字元(字串結束的標誌)

20樓:

要理解 你要知道 字串copy 幹什麼了 雙引號 做了3件事

1.申請了空間,存放了字串

2. 在字串尾加上了'/0'

3.返回地址

你這裡就是 返回的地址 賦值給了 p 希望採納~~~~~~~~~~~~~~~~

c語言中,為什麼字串可以賦值給字元指標變數

在c語言中並沒有bai 字串這個型別 du。所說的字zhi符串就是字元dao陣列。也就是char型別版的陣列。與普通陣列不同的,權字串必須以 0 作為結束符。而在c語言中,型別為t的一維陣列,其首地址等效於該型別的一維指標,即t 型。於是字串,也就是字元陣列,首地址就可以當做char 型使用了。事實...

c語言中,inta 3,b 2,c 1,為什麼賦值語句a b c 1錯誤了

賦值語句沒有錯,錯的應該是變數的說明語句 inta 3應該在變數與型別說明符間加空格以示區別 int a 3,b 2,c 1 沒有錯啊。include int main inta 3 這個連起來寫已經錯了。當然,排除你是筆誤。a b c 1,是合法的。沒有錯誤。在vs 2010中可以編譯通過。因為a...

為什麼c語言中不能用scanf函式反覆對同字元

int a scanf d a scanf d a scanf d a a是最後一次輸入的那個值 c語言中如何使輸出的字串佔8個字元 include int main 直接寫 printf 8s n 你的字串 就可以了 include stdio.h int fab int n char a 8 v...