指標是程式語言中的一種物件,計算機對資料的訪問是通過定址實現的,而指標就能存放資料的位址,使得程式設計師能夠通過對指標變數的操作來實現對資料(或說變數)的操作。
如圖:
這裡 p 是乙個指標變數,p 裡面存放著變數 a 的位址,那麼我們找到 p 就可以對變數 a 進行讀寫等操作了。
宣告格式:資料型別 *指標名;
例如:int *p;
這裡就宣告了乙個整數型別的指標 p
對指標變數賦值通過運算子 & 完成(如:p=&a)
對指標變數所指向的變數進行訪問通過 * 完成(如:*p)
#include
int main()
當然對於 char , long , float , double 等型別的資料都可以宣告指標變數
普通指標的用途:
1、指向單個變數
2、指向單個陣列
int a[10]=; //宣告乙個整形陣列
int *p; //宣告乙個整形指標
p=a; //把陣列 a 的首位址傳給 p
/*當然最後一行還可以寫為 p=&a[0] */
3、指向結構體
struct student
struct student *student1; //這裡就宣告了乙個 student 這個結構體的指標變數
4、指向函式(筆者將在後面的「指標函式」板塊進行討論)
上面我們介紹了單個的指標,如果我們現在需要多個指標呢,那怎麼辦?
當然,我們就應該多宣告一些指標變數,例如:int *p1,*p2,*p3 … …
讀者必想,這樣寫是不是太麻煩了,有沒有簡潔點的辦法就可以宣告多個同型別的指標變數呢?當然有的,那就是指標陣列。其實,指標陣列就是由多個同型別指標組合而成的陣列。
定義形式:資料型別 *p[n];
說明:n為指標陣列元素個數
例如:
#include
int main()
指標陣列的用途1、指向多個單一的同型別變數
2、指向多個陣列
//以指向乙個二維陣列為例
#include
int main()
3、指向多個同型別結構體
陣列指標是指向陣列位址的指標。
以二維陣列為例
定義形式:資料型別 (*p)[n];
說明:這裡的括號不可少,n為該陣列指標的一維子陣列的元素個數(可以省略,看不懂的話看例子)。同時,這裡涉及到運算子的優先順序(() 和 從左往右結合):() = > *
p 是乙個指標變數,它指向包含n個所宣告資料型別元素的一維陣列,此時 p 的增量以它所指向的一維陣列長度為單位;
*(p+i) 是二維陣列a[i][0]的位址;
(p+i)+j 表示a[i][j]元素的位址,(*(p+i)+j) 表示 a[i][j] 的值。
例如:
#include
; //宣告乙個二維陣列
int (*p)[4]; //宣告乙個陣列指標
int i;
p=a; //讓陣列指標指向該二維陣列
for(i=0;i<3;i++) //輸出每個一維陣列的首位址
printf("%d\n",*(p+i));
printf("\n%d\t %d\n",a[2][0],&a[2][0]);
printf("%d\t %d",*(
*(p+2)+0),*(p+2)+0);
return
0;}
執行結果:
指標函式本身是乙個函式,只不過這個函式的返回值為某一型別的指標。
例如:
#include
int*test(int
*p,int a);
int main()
; printf("需尋找的目標值(100),其位址為:%d\n",&score[0]);
printf("已找到目標值(100),其位址為:%d",test(score,100));
return0;}
int*test(int
*p,int a)
執行結果:
概念:函式指標是指向函式的指標變數。因而「函式指標」本身首先應該是指標變數,只不過該指標變數指向函式。這正如指標變數可指向整型變數、字元型、陣列一樣,這裡是指向函式。如前所述,c在編譯時,每乙個函式都有乙個入口位址,該入口位址就是函式指標所指向的位址。有了指向函式的指標變數後,可用該指標變數呼叫函式,就如同用指標變數可引用其他型別變數一樣。函式指標有兩個用途:呼叫函式和做函式的引數。
定義形式:返回值型別 (*指標變數名)(函式形參列表)
說明:同樣,這裡的括號不可少,也是要考慮運算子的優先順序
用函式指標呼叫函式:
#include
void test();
int main()
用函式指標作函式的引數:
#include
void fun(int i);
void usefun(void (*p)(int m),int i);
//這裡將 void (*p)(int m) 作為usefun函式的乙個形參
int main()
void fun(int i)
void usefun(void (*p)(int m),int i)
概念:二級指標既是指標的指標。一級指標 *p 是用於存放乙個變數 a 的位址的,即是通過這個一級指標我們可以對變數 a 進行操作;一級指標 *p 事實上也是變數,我們也需要對它進行一些操作,那麼就用另乙個指標變數來儲存這個一級指標的位址,這就是二級指標 **p
如圖:
這裡存在乙個變數 c ,b 為一級指標,a 為二級指標。c 中存放了乙個資料,而 b 存放著 c 的位址,a 又存放著b的位址。
二級指標可分為:指向指標變數的指標、指向陣列的指標
前者不再舉例,下面給出乙個指向陣列的指標例項
#include
int main()
; int
*p,**pp; //定義乙個一級指標 p 和乙個二級指標 pp
p=a;
pp=&p;
for(i=0;i<5;i++) //用二級指標變數輸出方式一
printf("%d\t",*(
*pp+i));
printf("\n");
for(i=0;i<5;i++,p++) //用二級指標變數輸出方式二
printf("%d\t",**pp);
return
0;}
至此,筆者能寫的就這麼多,下面再進行一下總結。
1、普通指標用於存放某變數的位址
2、指標陣列是一系列同型別指標構成的乙個陣列
3、陣列指標用於指向陣列位址。以二維陣列指標為例,陣列指標就是用於存放二維陣列一行所構成的乙個一維陣列的首位址。
4、指標函式是函式,其函式返回值為某一型別的指標
5、函式指標是函式,其指向某個函式,存放某個函式的入口位址值
6、二級指標是指標的指標,是用於存放某個指標變數的位址的。
C語言中Static的作用詳述
在c語言中,static的字面意思很容易把我們匯入歧途,其實它的作用有三條。1 先來介紹它的第一條也是最重要的一條 隱藏。當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,乙個是a.c,另乙個是main.c。...
C語言標準庫概覽詳述 6 訊號
標頭檔案中提供了一些用於處理程式執行期間所引發的異常條件的功能,如處理 於外部的中斷訊號或程式執行期間出現的錯誤等事件。void signal int sig,void handler int int signal 用於確定以後當訊號sig出現時的處理方法。如果handler的值是sig dfl,那...
C語言指標
指標變數是包含記憶體位址的變數,它指向記憶體中的一塊區域,通過指標的值,可以間接訪問到相應的記憶體單元的資料,並做相應的修改。1 指標的定義和簡單使用 定義乙個指標變數和定義一般的變數類似,只需在變數名前面加乙個 對乙個指標變數賦值可以用取位址符 來獲取到乙個變數的位址,如果要獲得指標指向的記憶體區...