C語言指針問題,初始化,賦值,以及字符數組,字符串常量等問題

首先說指針,指針的定義及初始化格式如下:

int a=10;

int *p=&a;

int *q=p;


我們定義一個變量的時候,格式是 

<變量類型>  <變量名> ;


對於指針來說,變量類型是包括  *  符號的,也就是說上面定義的指針p的變量類型是int * ,指針q的變量類型也是int *

所以對於指針類型變量的定義,以上寫法對於新手來說容易造成困惑,尤其是再加上p=q這樣的賦值語句之後,新手肯定會困惑

因此我們把以上定義寫成如下形式,

int a=10;

(int *) p=&a;

(int *) q=p;

這樣就非常直觀了,指針變量用起來和普通變量沒有什麼區別。



================================================================

C語言有兩種表示字符串的方法,一種是字符數組,另一種是字符串常量,它們在內存中的存儲位置不同,使得字符數組可以讀取和修改,而字符串常量只能讀取不能修改。

char ch[]="hello";

char *ch="hello";

它們最根本的區別是在內存中的存儲區域不一樣,字符數組存儲在全局數據區或棧區,第二種形式的字符串存儲在常量區。全局數據區和棧區的字符串(也包括其他數據)有讀取和寫入的權限,而常量區的字符串(也包括其他數據)只有讀取權限,沒有寫入權限。

我們將第二種形式的字符串稱爲字符串常量,意思很明顯,常量只能讀取不能寫入。請看下面的演示:

  1. #include <stdio.h>
  2. int main(){
  3. char *str = "Hello World!";
  4. str = "I love C!"; //正確
  5. str[3] = 'P'; //錯誤
  6. return 0;
  7. }
這段代碼能夠正常編譯和鏈接,但在運行時會出現段錯誤(Segment Fault)或者寫入位置錯誤

第4行代碼是正確的,可以更改指針變量本身的指向;第3行代碼是錯誤的,不能修改字符串中的字符。


發佈了34 篇原創文章 · 獲贊 29 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章