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

2021-12-23 01:11:54 字數 5473 閱讀 8617

1樓:風若遠去何人留

對於printf這個函式,有著一系列的格式符號 比如你說的%d %s不同的格式,有著不同的引數型別要求

比如%s 要求對應引數必須是char *型的 你例子中的string就是這一型別

所以不會出錯

如果換成printf("%s",*string);,*string為char 型,對應的格式是%c

而%d對應的是整型,包括int short char等都可以用這個格式字元,不是int的會被轉成int

類似的%f float

%u unsigned int

對於格式輸出,在網上有很多介紹 你也可以自己搜尋一下

2樓:匿名使用者

指標就是位址。

printf()函式的格式控制,%d是輸出乙個整型資料,因此要用*p。

%s是輸出乙個字串,因此要用字串的首位址,char *str,str就是指向字串的首位址。

如果用*string,就是printf("%c",*string),輸出第乙個字元。

3樓:黃曉輝

字串指標是指向字串的首位址,就像陣列一樣,陣列名就是首位址,這也是一樣。輸出字串直接用指標名就可以了。

*p。*加指標名是取指標所指向的位址的值。這裡指標p指向整形a的位址,取位址的值就是a的值。

4樓:匿名使用者

*string==*(string+0)==string[0]='x' (string[0]的值,單個字元)

string=="***" (string指向的字串,位址)*p==a (a的值)

p==&a==0x???????? (a的位址)

5樓:匿名使用者

請重新學習c語言「陣列」相關知識。

char * string="***";

實際上是叫編譯器給你分配4位元組的陣列記憶體(不是3,因為子串尾部是'\0'),string是指向該陣列首位址的指標。

printf("%s",string);中引數必須是位址,剛才說了,string應該是字元陣列的位址,*string是字串「***」中的第乙個"x「。

這樣說你明白了吧,如果還不清楚,請追問。

6樓:木材嘟嘟

1、寫成 char* string=「***」;是不是看著明白些了? char* 表示便令型別為字元指標,變數名為string;所以輸出時寫string而不是*string;

2、p=&a ,&表示引用,引用的結果是p和a的儲存位址是一樣的,他們的資料取值是一樣的,p=&a,則*p=*&a;*和&可以看做抵消就是*p=a,所以第二個寫作*p,而不是p;

3、不明白的話可以看看指標和引用的定義和使用。指標靈活,引用簡單,多用就好了。

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

7樓:風若遠去何人留

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

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

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

8樓:潘達

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

9樓:

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

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

10樓:

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

11樓:尼瑪真響亮

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

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

12樓:ai看雪

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

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

13樓:大野瘦子

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

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

a[2]='c';

就可以了。

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

14樓:種令芮德曜

char*

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

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

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

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

15樓:匿名使用者

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

16樓:

這不是絕對的:

bai當指du

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

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

17樓:匿名使用者

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

存空間的字

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

char a[6]="hello";

a[2]='c';

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

18樓:匿名使用者

char *a="hello";

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

19樓:匿名使用者

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

20樓:匿名使用者

不能修改!

char *p="hello";

相當於 const char *p="hello"

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

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

21樓:匿名使用者

在c語言中並沒有bai

字串這個型別

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

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

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

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

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

22樓:路圖元

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

23樓:匿名使用者

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

24樓:土杜土杜

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

25樓:棄嬰

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

26樓:五轉故劍情深

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個位置存放額外追加的空字元(字串結束的標誌)

27樓:

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

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

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

3.返回位址

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

c語言,如何用指標變數實現啊?

28樓:聽不清啊

**中少了乙個標頭檔案ctype.h

#include

#include

#include

main()

{ char str[81];

int i,flag;

/******* 1 ******/

gets(str);

for(i=0; *(str+i)!='\0';){ flag=tolower(*(str+i))>='a' && tolower(*(str+i))<='z';

/********* 2 *********/flag=!flag;

if(flag)

{ /******* 3 ********/strcpy(str+i,str+i+1);

/******* 4 ********/

continue;

i++;

printf("%s\n",str);

C語言指標函式替換字元

下面的程式可以把句子中所有的an都換成a。include main printf s n a 輸出字串要用 s 字串替換,需要兩層迴圈判斷 char replace char source,char sub,char rep 如果沒找到子串,下面複製source所指位元組到結果串 pc1 sourc...

c指標變數的問題,C語言指標變數大小的問題

p 1,是把1賦值給p所指向的物件,而p 1是把1賦值給p,這個1是被當做位址的。p 1和p 1是不同的概念,p 1 是賦值語句,還有在c語言中 1 0 是作為真假來用的,就相當於布林型數一樣。這兩個語句都是合法的。區別就是指標 的意思是取位址的意思。p是乙個指標,他的值是記憶體中一塊記憶體的位址,...

初學C語言字串指標陣列的問題,關於C語言字串指標陣列的問題

樓主可以分別執行下這兩個程式 include void main void include void main void 第乙個無法執行,為什麼?因為 s abc abc 是從靜態儲存區域所分配的記憶體,所以導致s 0 無法改變,所以 abc 為常量字串 ps 常量字串的內容是不可以被修改的 第二個...