C語言 指標詳解(一)

2021-07-02 01:28:05 字數 2985 閱讀 2823

一、指標是什麼?

要知道什麼是指標,先來了解下指標的儲存和讀取。

當我們在對程式編譯時,會為變數分配儲存單元。如我們定義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...