五, 關於指標

白夜行zz發表於2014-12-19

我學C語言那年,指標內容是不作為上機考試的要求的。。。所以對這個C語言很重要的一塊內容就一直留下了一個硬傷。。。

其實我還是知道指標是什麼的,指標是一個變數,它指向一個地址,這個地址裡面可以存放某一種資料型別的一個資料,也可能是某個函式或者陣列的首地址。。。但是,我還是覺得我不理解他,為什麼呢,主要的原因是我不會用,不會用導致不想用,越不用越不會,越不會越想在程式設計的時候避開它。於是就一直死迴圈到了現在。。。

關於具體的指標的介紹和描述可以參看 C語言中文網。他描述的比我的靠譜多了,有助於清楚的理解指標到底是什麼,後面的舉例和說明也借鑑了這個網站的部分內容。

C語言中,用 * 號表示指向,比如下面程式碼中,i_pointer代表指標變數,而*i_pointer是i_pointer所指向的變數。因此,下面兩個語句作用相同:

i=3;
*i_pointer=3;

第2個語句的含義是將3賦給指標變數i_pointer所指向的變數。

我具體想總結的是,我們在程式設計的時候究竟應該怎樣使用它:

1, 定義指標變數:比如int *p1; float *p2;

第一句表示p1是一個指標變數,它的值是某個整型變數的地址。或者說p1指向一個整型變數。至於p1究竟指向哪一個整型變數,應由向p1賦予的地址來決定。第二句同理

應該注意的是,一個指標變數只能指向同型別的變數,如P32只能指向浮點變數,不能時而指向一個浮點變數,時而又指向一個字元變數。

2, 指標變數的賦值

未經賦值的指標變數不能使用,否則將造成系統混亂,甚至當機。指標變數的賦值只能賦予地址,決不能賦予任何其它資料,否則將引起錯誤。

這裡需要用到另一個運算子,&:取地址運算子,比如a是一個int變數,&a就表示變數a的地址。

有了這個運算子我們就可以對指標進行賦值:賦值有兩種很相似卻又不太一樣所以很容易弄混的方法:

方法1:int a; int *p = &a;

方法2: int a; int *p; p = &a;

上課那會看到這兩句的時候就暈了哇,做實驗的時候完全不知道什麼時候該加*什麼時候不加啊啊啊。。。我還慢慢的嘗試過,指標前面加星號編譯一遍,如果有錯誤就把星號去了再編譯一遍,哪次通過哪次算。現在想想當時好機智。。。。

其實仔細想想也不難啊,p是指標變數,*P表示指向即表示p所存的地址中所儲存的值。。。所以像 *p = &a; 肯定是錯的哇,兩邊的型別不一樣啊。。左邊的是指向的資料型別右面的是地址啊。。。

所以我們如果再有一個int型別的x,用語句 x = *p; 我們便可以通過指標變數p間接訪問變數i

3, 為什麼使用指標

雖然我編的程式比較小是一方面,主動迴避是另一方面,反正我基本不太用指標,能避開的都避開了,無非就是麻煩一點麼,程式寫的複雜混亂一點麼。但是我已經開始意識到這是不對滴~~使用指標的好處非常明顯,因為指標是變數,我們可以通過改變它們的指向,以間接訪問不同的變數,這給程式帶來靈活性,也使程式程式碼編寫得更為簡潔和有效。

4, 兩個指標比較常用的例子

第一個比較常用的例子就是指標陣列。

我們定義一個陣列和一個指標: int a[10]; int *p;

C語言規定,陣列名代表陣列的首地址,也就是第0號元素的地址。因此,下面兩個語句等價:

P = &a[0]; p = a;

所以我們便有兩種方法來訪問陣列

下標法:即用a[i]形式訪問陣列元素。

指標法:即採用*(p+i)形式,用間接訪問的方法來訪問陣列元素,

第二個就是使用指標作為函式的引數

比如下面的例子: swap(int *p1,int *p2){ int temp; temp=*p1; *p1=*p2; *p2=temp; } main(){ int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a;pointer_2=&b; if(a

這個例子就體現了使用指標的好處,兩個值的互換可以通過使用指標使指向互換來實現,要注意以下的兩種方法是不能實現上述功能的,

錯法1:

swap(int x,int y){
int temp;
temp=x;
x=y;
y=temp;
}

錯法2:

swap(int *p1,int *p2){
int *p;
p=p1;
p1=p2;
p2=p;
}

道理比較好理解,只交換形參是沒有意義的。

相關文章