c語言字元指標問題,一個c語言字元指標問題!

2021-05-04 18:25:50 字數 5547 閱讀 4593

1樓:海獅

看了目前的回答,覺得還不完整。

1、為什麼不能修改:

其實不一定,不讓修改是一種保護。

linux kernel前一陣子報告的嚴重問題的就是可以修改這個東西了。

如果能夠修改,這個ch="abcdefg"的語義就不正確了。

因為,假設如果有下面的程式:

ch="abcdefg";

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

如果按照正常理解,應當總是列印"abcdefg",但是如果你剛才的那個能夠執行,那可就不是了。

看看下面的程式:

bug:

ch="abcdefg";

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

*(ch+1)='a';

goto bug;

那豈不是第一次列印"abcdefg",後面都是列印"aacdefg",如果這樣也可以,c語言的程式就沒辦法看了。

理論上,這種錯誤很明顯,所以一般的編譯器會檢查出來,說編譯器檢查不到的說法是錯誤的。但是因為c語言是弱型別語言,檢查出來也不彙報告,換做c++就不行了,會告訴你,ch="abcdefg",這句話有問題。因為"abcdefg"是一個const char [8],但是ch是一個 char *這種轉換很危險。

2、複製不行,型別不匹配,很多書上在這個問題上寫的都不對。

陣列型別不是指標型別,差別很多。

舉個例子:

這個會報錯

char *ch="abcdefg";

*(ch+1)='a';

這個呢char ch[10]="abcdefg";

*(ch+1)='a';

先說說一維陣列的型別:

char ch[10];

ch的指標的型別是

char (*p)[10];

p=&ch;

所以能夠和str賦值的x的型別是:

char (*x)[100];

x=str;

或者說指標沒有長度,而陣列有,怎麼賦值呢?

2樓:匿名使用者

1。已知:常量不允許修改,間接修改編譯器檢查不到,執行時才會報錯,常量字串也是常量 你這裡是通過地址,間接地改變它所在區域的內容,這是非法的 2。

賦值可能不行,型別不匹配,2維指標不確定2維陣列有多少列,間接地說一下,指標+1這樣的運算,不知道要加多少便宜 3。 陣列裡面的就不是常量字串了,它將字串拷貝了一份存在自己的記憶體中,修改的是自己記憶體中的內容

3樓:匿名使用者

第一問:

因為「abcdefg」這個字串存放在c語言定義記憶體的靜態儲存區,這個區的特點是程式執行時不能修改其內容,而當指標指向這個儲存區時,也當然不可以修改啦。可修改內容的區有記憶體棧區和記憶體堆區,而靜態生成的陣列就定義在棧區,如果你的指標指向該區,當然就可以修改啦,所以你的程式寫成這樣:char *ch;char a="abcdefg";ch =a; 則可以這樣修改:

*(ch+1)=『a』;這是因為棧區可以修改的啦。

第二問:

因為你的x是指向指標的指標,這個意思是這個x是一個指標,這個指標指向的變數的儲存區必須是指標型別的,而你的str[20][100]申請的二維陣列時按線性排列的儲存區(如下圖所示),且儲存的內容是char型而不是指標型,雖然str是一個指標,但是這個指標指向的是陣列的第一個元素,和一維陣列的指標沒有太大區別,只是區別在指標加一時是按照陣列列的長度來移動指標,所以該指標不是一個指向指標的指標,而是一個指向元素的指標,當讓不能賦值給指向指標的指標ch啦,一般大家都是通過一箇中間的指標陣列來過渡的,這樣寫:char **x;char *a[20];char str[20][100]={}; x=a;for(i=0to20)a[i]=str[i];這是因為a陣列元素存的是指標,所以陣列名是一個指向指標陣列的指標,當然就可以賦值給x了。但是你要注意的是指標的移動只是按照一個元素一個元素的移動,他不會隨你指向的是陣列元素而變成二維陣列那樣的移動一個行,所以在使用多級指標而不是多維陣列名時要這樣寫:

*(*(x+2*100)+3)='1';

寫的手都麻了,還畫了圖,樓樓加分啊!

4樓:

你自己有沒有親自測試過?

你就確定網上說的都是真的?char *ch = 「abcdefg"; *(ch+1)='a';真的不可以修改???

建議還是自己親自動手測試一下!

附上測試**:

#include

void fun(char a[10])

int main(void)

;//fun(a);

printf("a = %d\n", a);

char *p = "abcd";

*p = 'x';

printf("*p = %c\n", *p);

*(++p) = 'y';

printf("*p = %c\n", *p);

p[2] = 'z';

printf("p[2] = %c\n", p[2]);

//p[3] = '\0';

printf("*p = %s", p);

return 0;}

5樓:沫沫魚在吉林

對於第一個 ch是一個指標變數,他只能指向地址,ch="abcdefg";是將該字串的首地址賦給ch,也即將ch指向該字串首地址;而*操作與&互為逆運算,*ch是將ch所指向的地址記憶體中的數取出來----也就是說*ch是個常量,不能對其賦值。

對於第二個問題,你可以試一下x=str是不行的;這個問題我們不需深究;但你要記住,一 維陣列

int *x=p是可以的,但是對於二維陣列int **x=str是不可以的;那麼我們可以這麼理解記憶一維陣列首地址是1,二維陣列首地址是1.5;一級指標是1,二級指標式2;即一維陣列首地址能給一級指標賦值;但二維陣列不能給二級指標賦值。

x=str; 會出錯;

*(*(x+2)+3)='1';同樣會出錯 你可以再編譯器上試試。

6樓:匿名使用者

*(ch+1)='a';

改為ch[ch+1]='a';

原因是ch是陣列。

------------------------x不可以直接指向str!因為x是二級指標,x是指向指標的指標,指向str只要用char *x就可以。

char *x;

x=str;

str[str[(x+2)]+3]=『1』;

這樣可以

7樓:匿名使用者

因為按照你的式子,等號的左邊為表示式,這樣是非法的。無論是「取內容」運算,還是加減法運算,都是不允許的。

c語言字串指標問題

8樓:過雲回青易

在編譯期間,編譯器得到的結果是,指標a和b指向的是靜態區間,這段區域是不能隨意改變的,而在後續的

while(*p2++=*p1++);中,卻給p2也就是b賦值了,這樣會出錯的,如果一定要做這樣的功能,建議在開始宣告兩個字串的時候,用chara

9樓:匿名使用者

這裡"hello"是一個sz字串,你可以把它看坐是一個字元陣列陣列裡有7個元素'h','e','l','l','o','/','0',p就是指向這個陣列首地址的指標,所以p裡面存的是這個陣列的首地址,使用的時候p依次加1,就可以取得裡面所有字元。或者用printf(「%s」,p);直接輸出一個sz字串

10樓:

hello雖然是常量字串,但是它需要儲存記憶體的棧上,指標p指向該常量字串的記憶體首地址

11樓:匿名使用者

你這樣等於把hello當地址付給了p 所以p就是指向字串的第一個地址'h', c語言裡面可以把字串當地址給指標 而且字串地址就是本身它自己 這也就是 *p輸出的是'h' 了

但p=『h』就另當別論了 *p就可能是其他了 沒定義字元地址就是它自己 在c++中可能根本不允許 char *p='h';

12樓:匿名使用者

首先,指標不是地址。p是指標變數,這個變數是記憶體中的一塊空間,可以用來儲存資料,但是要求這個資料——必須是字串「型別」的地址,才可以存放。「hello」,在c語言中不是字元,而是字串,儲存字串「型別」可用char×。

13樓:匿名使用者

讓p指向常量字串hello的首地址,即p中存hello的第一個字元在記憶體中的地址,p="hello";

就等於把字串首地址賦給了指標變數p

希望能夠幫到您

補充您的提問如下:

這雖是一個賦值表示式,但不是把內容hello賦給指標p,p的內容仍是地址,是字串hello的首地址,實際上此表示式就是把字串首地址賦給p,讓p指向常量字串hello的記憶體單元,就是這個意思,有點繞,希望您明白了。

14樓:匿名使用者

指標當然也需要地址來儲存,但是指標儲存的內容是記憶體地址而已

15樓:匿名使用者

p指向字串的首地址,即'h'

16樓:

兩種都是說明字串變數的的辦法

char *p 表示p是一個指向某個字串首地址的指標,但此時該字串還不存在,也沒分配空間

p=「hello」 可以理解為p是一個字串變數,但該字串已經分配空間

還可以這樣定義:

p[5+1]=;

兩者的一些區別:

對於char *p 來說

*p = 「hello」; 合法

strcpy(p,"hello"); 非法gets(p); 非法

對於p[5+1]=;或(p="hello";) 來說p=「hello」 非法

strcpy(p,"hello"); 合法gets(p); 合法

17樓:貧寒烏鴉

這裡是定義了一個字元指標p,再將字串常量"hello"的第一個元素的地址(即存放字串的字元陣列的首元素地址)賦值給它。如果誤認為是將這個字串賦值給他是不對的,以上的語句等同於:

char*p="hello";

這裡是初始化。

可以看到p被定義為一個指標變數,指向字元型資料,輸出時,要用:

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

在輸出時,系統先輸出它指向的一個字元資料,然後自動使p加1,使之指向下一個字元,然後在輸出一個字元···如此直到遇到字串結束標誌'\0'為止。

說明:通過字元陣列名或字串指標變數可以輸出一個字串,而對一個數值型陣列,是不能企圖用陣列名輸出他的全部元素的。

具體的可以參考譚浩強編寫的《c語言程式設計》一書,上面有詳細的介紹。

18樓:匿名使用者

"hello"是字串

19樓:滄海笑蝸牛

看書去吧 這是c語言基礎!

20樓:甕友英麗

你好!p記錄的其實是"iama

good

boy"字串的首地址,呼叫printf函式時,傳遞的是p(字串的首地址),printf函式的實現部分按字串首地址依次搜尋出字串的字元,直到遇到『\0』停止!

純手打,請給分,謝謝!

c語言關於字串輸入的問題,一個C語言字串輸入問題

有明顯的致命錯誤 c語言字串輸入時,不要加地址符號 因為陣列名就表示地址。for int i 0 i 2 i 另外再加個標頭檔案 include c語言中比較兩個字串是否相等,不能直接比較if stu j name nm 應改成if strcmp stu j name,nm 0 if stu j n...

c語言符指標和字元陣列的區別c語言字元指標和字元陣列的區別

首先第一點,非常重要的一點 指標和陣列是不同的兩個型別!我們從可以從c語言標準文件中得知 iso iec 9899 1999 programing language c 6.2.5 types 20 這說明了什麼是陣列型別 同樣在20 說明了什麼是指標型別。在瞭解了兩種型別的基礎上,我們瞭解陣列和指...

c語言指標怎樣指向一段字串,C語言指標怎樣指向一段字串?

第五十六集 指標指向字串 將指標指向該字串的首地址即可。比如 char a abscdf char p a 將字串 abscdf 的首地址 即陣列名 賦值給指標p puts p 等價於puts a 也可以參考下面的示例程式 char p abscdf 在定義指標的時候,就使指標p指向該字串 首先s是...