一、指標是什麼?
要知道什麼是指標,先來了解下指標的儲存和讀取。
當我們在對程式編譯時,會為變數分配儲存單元。如我們定義int a=10;就是為a這個整型變數分配了4個位元組。記憶體區的每乙個位元組都有乙個編號,這就是「位址」,相當於旅館中的房間號。在裡面存資料就相當於在這個房間中住旅客了。
由於通過位址能找到變數單元,所以我們說位址指向這個變數單元。
二、指標的定義和使用
1、小例子看指標
int a = 10;————>定義了乙個整型變數,並賦值為10;
int *p;——————>定義了乙個指標,這裡的*僅僅表示p乙個指標,沒有其他任何含義;
p=&a;——————>我們把p指標指向了a,也表示把a的位址給了p;
printf(「a=%i\t;p=%p\t;p指向的值是:%d\n」,a,p,*p);———>我們分別列印a的值,p的位址值,p指向的位址裡面的內容。
可以看出,當我們把p指向a時,我們可以說a和*p代表的是同乙個東西。
所以指標的定義格式為:資料型別 *指標變數名
這裡介紹兩個符號 :
(1)& 取位址運算子。&a是變數a的位址。
(2)* 指標運算子(或叫「間接訪問」運算子),*p代表指標變數p指向的物件。
2、變數訪問方式
②間接訪問:將乙個變數的位址存放在另乙個變數中。如:將變數 a 的位址存放在變數p 中, 訪問a 時先找到p,再由p 中存放的位址找到 a。
3、注意:
(1) 在變數定義時,* 號表示該變數是指標變數。
(2)定義指標變數後,系統為其分配儲存空間, 用以存放其他變數的位址, 但在對指標變數賦值前,它並沒有確定的值,也不指向乙個確定的變數。
(3)p與*p不同,p是指標變數, p的值是p所指向的變數的位址。 *p 是p 所指向的變數 ,*p的值是p所指向的變數的值。
(4)引用指標變數時的 * 與定義指標變數時的 * 不同的。定義變數時的 * 只是表示其後的變數是指標變數。
4、簡單的指標運算
我的錯誤:
int a=2,b=5,c,d,*p;
(1) p=&a;
(*p)++;———>等價於a++;
p的值是a的位址,*p的值是2,p的值不變,完後*p的值加1變為3。
(2) c=*p++;———>等價於c=*(p++);
執行後c的值為3,*p的值為5。
(3) d=*++p;———>d*(++p);
執行後d為3,*p為3。
注意:上面這是錯的,為什麼我也要寫出來呢?因為這是很容易忽視的問題,那就是順序儲存。我們自認為我們的指標能一級往下找,其實不是這樣的,通過下圖就明白 了。
這與我們預料的完全不一樣,從這裡可以看出p++其實是加了一int的長度,即把指標往後挪4個位元組。
4、下面求2個數的大小的程式,我們可以看出,指標也有類似於「單向值傳遞」的規律。
int *p1,*p2,*p,a,b,max,min;
scanf("%d %d",&a,&b);
p1=&a;
p2=&b;
if (a
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d\n",*p1,*p2);
這兒知道只是指標變換了一下,等於把門牌號換了一下,但是旅客並沒有變。
三、指標和函式
(1)指標變數做為函式引數
void test1(int num1,int num2)
void test2(int *p1,int *p2)
void test3(int *p1,int *p2)
int main()
#include void test1(int num1,int num2)
void test2(int *p1,int *p2)
void test3(int *p1,int *p2)
int main()
解釋見函式呼叫時的注釋,挨得近,看得明白
(2)函式返回指標
前面我們用到的函式, 有些無返回值, 有些有返回值,乙個函式的返回值也可以是乙個指標型別的資料。
定義結構:
資料型別 *函式名(形參表)
說明:定義乙個返回指標值的函式與以前定義函式格式基本類似, 只是在函式名前加 * , 它表明該函式返回乙個指標值。
(3)指向函式的指標
函式的指標: 函式的入口位址
在程式執行過程中呼叫函式時, 計算機會轉去執行函式體內的語句, 因此計算機必須知道函式在什麼地方。實際上函式在記憶體中也要佔據一片儲存單元, 這片儲存單元乙個起始位址, 我們稱其為函式的入口位址,即函式的指標, 這個函式的入口位址是用函式名來表示。
因此我們可以定義乙個指標變數, 讓它的值等於函式的入口位址, 然後可以通過這個指標變數來呼叫函式, 該指標變數稱為指向函式的指標變數。指標和陣列。
1>定義結構:
資料型別 (*函式名)(形參表);
2>說明:
①資料型別: 指標變數所指向的函式的返回值型別
②形參表列: 即指標變數所指向的函式的形參表列
③格式中的小括號不能省略
④因為函式名為函式的入口位址,所以直接將函式名賦給指標變數即可
⑤使用指標變數呼叫函式格式 : (*指標變數名)( 實參表列)
#include
int add( int b[ ] , int n);
void main( )
,total ;
int (*pt) ( int b[ ] , int n ) ;
pt = add ;
total = (*pt) ( a , 6 ) ;
printf( 「total = %d \n」 ,total ) ; }
int add( int b[ ] , int n )
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...