C語言指標詳解

2021-09-27 03:36:46 字數 3087 閱讀 2588

&是取位址符號;

*是定義指標變數,即指向記憶體單元的指標;

#includeint main()

//列印結果:

a 的值為20

a 的位址為1703740(1703740為a位址0019ff3c的十進位制)

& 符號的作用很清晰, &a就是取變數a的位址。

#includeint main()

//列印結果:

ip 的值為20

為什麼只列印了乙個值呢?剛開始學習不是很懂,回去查指標變數的定義,再加上網上查閱各種資料,定義說:*表示乙個指標變數,指向記憶體單元,指向記憶體單元,應該就是位址吧,那麼ip變數應該被賦值乙個位址,前邊說的 & 不就表示乙個位址嗎,試一下

#include int main ()

//列印結果:

a 的值為 5

&a 的值為 1703740

b的值為1703740

*b 的值為 5

定義變數時int* a;int* 表示取指標,在位址前加*表示這個位址的內容。

函式指標的定義:

returntype (*pointername)(param list);

指標函式的定義:

returntype *pointername(param list);

returntype為函式返回值型別,pointername 為指標名稱,param list 為函式引數列表,函式指標賦值為函式位址。注意:( )的優先順序高於*,第乙個括號不能省略,如果寫作returntype *pointername(paramlist);就成了函式原型(指標函式),它表明函式的返回值型別為returntype *,返回值型別為1個指標。

呼叫函式直接呼叫就好了,為什麼還要定義乙個函式指標呢,才接觸時很不理解,後了解到由於函式指標儲存的是乙個記憶體位址,在傳參的時候傳入乙個位址比傳入乙個位址對應的函式名更高效,運算速度更快。

陣列是一種結構型別,在某種意義上來說陣列名就是指標,可以轉化為指向其實體的指標,指標則是變數,僅僅意味著陣列的存放位址,陣列名概念比較寬泛,也更加複雜,而指標僅僅代表陣列的首位址

#include int main()

; int *p=a;

printf("陣列a首位址%d\n",&a);//陣列a首位址1703724

printf("陣列a首位址%d\n",p);//陣列a首位址1703724

printf("a所佔空間%d\n",sizeof(a));//a所佔空間20(a代表整個陣列,大小為4*5=20)

printf("*p所佔記憶體空間%d\n",sizeof(p));//*p所佔記憶體空間4(*p僅僅指向首位址)

printf("*p指向位址的內容%d\n",*p);//*p指向位址的內容1

return 0;

}

#include#includeint main();

char **p;//定義指向指標的指標

int k;

for(k=0;k<4;k++)

return 0;

}

總結

&a表示a變數的位址,scanf("%d",&a)中&a就是將輸入的值存入a變數的位址中

*ip定義乙個指標變數ip,ip代表指標變數,賦值內容為位址(即指向變數的位址)

*ip表示值是位址的變數,訪問的是ip位址內容

在陣列中指標變數僅僅代表陣列的首位址,陣列名就陣列的首位址

int p; //這是乙個普通的整型變數  

int *p; //首先從p 處開始,先與*結合,所以說明p 是乙個指標,然後再與int 結合,

說明指標所指向的內容的型別為int 型.所以p是乙個返回整型資料的指標

int p[3]; //首先從p 處開始,先與結合,說明p 是乙個陣列,然後與int 結合,

說明陣列裡的元素是整型的,所以p 是乙個由整型資料組成的陣列

int *p[3]; //首先從p 處開始,先與結合,因為其優先順序比*高,所以p 是乙個陣列,然後再與*結合,

說明陣列裡的元素是指標型別,然後再與int 結合,說明指標所指向的內容的型別是整型的,

所以p 是乙個由返回整型資料的指標所組成的陣列

int (*p)[3]; //首先從p 處開始,先與*結合,說明p 是乙個指標然後再與結合(與"()"這步可以忽略,

只是為了改變優先順序),說明指標所指向的內容是乙個陣列,然後再與int 結合,

說明陣列裡的元素是整型的.所以p 是乙個指向由整型資料組成的陣列的指標

int **p; //首先從p 開始,先與*結合,說是p 是乙個指標,然後再與*結合,說明指標所指向的元素是指標,

然後再與int 結合,說明該指標所指向的元素是整型資料.

由於二級指標以及更高階的指標極少用在複雜的型別中,

所以後面更複雜的型別我們就不考慮多級指標了,最多隻考慮一級指標.

int p(int); //從p 處起,先與()結合,說明p 是乙個函式,然後進入()裡分析,

說明該函式有乙個整型變數的引數,然後再與外面的int 結合,

說明函式的返回值是乙個整型資料

int (*p)(int); //從p 處開始,先與指標結合,說明p 是乙個指標,然後與()結合,

說明指標指向的是乙個函式,然後再與()裡的int 結合,說明函式有乙個int 型的引數,

再與最外層的int 結合,說明函式的返回型別是整型,

所以p 是乙個指向有乙個整型引數且返回型別為整型的函式的指標

int *(*p(int))[3]; //可以先跳過,不看這個型別,過於複雜從p 開始,先與()結合,

說明p 是乙個函式,然後進入()裡面,與int 結合,說明函式有乙個整型變數引數,

然後再與外面的*結合,說明函式返回的是乙個指標,,然後到最外面一層,先與結合,

說明返回的指標指向的是乙個陣列,然後再與*結合,說明陣列裡的元素是指標,

然後再與int 結合,說明指標指向的內容是整型資料.

所以p 是乙個引數為乙個整資料且返回乙個指向由整型指標變數組成的陣列的指標變數的函式.

c語言指標詳解

一.指標的概念 指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。1.指標的型別 從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部...

C語言指標詳解

類似於 int p char p 或者自定義型別的 person p struct p 這些都是基本的指標變數,不管什麼型別的指標變數都是乙個存位址的變數,所以它們的大小都是四個位元組 還有一種void p 型別,類似於 js 或者 c 的 var 可以傳入任何型別變數的位址,也可以轉換成任何型別變...

C語言指標詳解

c語言指標應用 一 指標是什麼 指標是乙個特殊的變數,它存的是記憶體裡的乙個位址。指標四要素 1.指標的型別 把指標名字去掉,剩下的部分就是這個指標的型別。這是指標本身所具有的型別如下 1 int p 指標的型別是int 2 char p 指標的型別是char 3 int p 指標的型別是int 4...