c語言指針應用總結


一、指針指向變量:(一般指針)

下面有這樣一個代碼塊:

int  main()

{int a=10;int b=15;test(a,b);printf("a=%d,b=%d\n",a,b);}

void test(int  x,int y)

{int tmp;tmp=x;x=y;y=tmp;}

最后輸出的結果還是a=10,b=15。

因為在函數調用時,實參和形參之間只是值傳遞。

但我們使用指針結果就不一樣了,如:

int  main()

{int a=10;int b=15;test(&a,&b);printf("a=%d,b=%d\n",a,b);return 0;}

void test(int * x,int *y)

{int tmp;tmp=*x;*x=*y;*y=tmp;}

輸出結果a=15,b=10。變量a和b的值發生了交換。

這是因為我們利用指針訪問變量的存儲單元,間接修改變量的值。

/*函數體內的AB和函數體外的AB是不同的變量,程序運行時體外函數的值傳遞到函數體內,但體外AB的值沒有發生改變,經過引用函數的運算,函數體內的AB值發生了變化,函數引用完畢后體內AB銷毀,但體外AB的值並未發生變化。而函數直接引用體外變量的指針值(*p)進行運算,會對體外被引用變量的值產生改變。*/

-------------------------------------------------------------------------------------------------------------------------------------

二、指針指向數組(數組指針)

定義一個數組並初始化,int array[5]={2,5,12,7,8},定義一個指針變量並把數組的地址賦給它,int *p=array,注意數組名就是數組的地址,而且數組的地址就是首元素的地址。

因此我們的指針變量就指向了數組的首元素,*p=2。如果把(p+1),那么指針變量就指向了數組的下一個元素5,因此我們可以利用指針來遍歷數組的各個元素:

int  main()

{int array[5]={2,5,12,7,8};int *p =array;for(int i=0;i<5;i++){printf("array[%d]=%d\n",i,*(p+i));}return 0;}

/*數組指針可以通過值運算(*p++)或*p++和地址運算p++直接操作數組元素,int a=a[];int *p; *p=a 則 *p=a[0]       */

-------------------------------------------------------------------------------------------------------------------------------------

三、指針指向字符串(字符串指針)

我們都知道用數組存儲字符串,如char name[20]="jack",上面已經簡單講述了指針指向數組,所以我們可以這樣做,char *name="jack",指針變量指向字符串的首個字符並可以依次訪問字符串的各個字符。

//數組指針可以通過值運算(*p++)或*p++和地址運算p++直接操作字符和字符串,類似於數組指針

// 注意:(*p)++是對*p 的值進行++運算

-------------------------------------------------------------------------------------------------------------------------------------

四、指針指向函數(函數指針)

我們需要知道怎樣表示一個指針指向函數,說白了就是語法要正確,下面我也取一個代碼塊來說明一下:

int sum(int x,int y)

{return x+y;}

int main()                                                   //定義一個函數

{

int a=5;int b=6;

int (*p)(int,int);                                         //定義一個函數指針,(*p)()是函數指針的標志。

p=sum;              

 /*指針賦值,這個值就是指向的這個函數。這個和一般指針賦值有所區別,類似於數組名相當於首地址的意思,可以不用取址符&         函數名(SUM )本身有指向函數首地址指針的意義                 */

int result=(*p)(a,b);

printf("The result is %d\n",result);return 0;

}

不難發現上面代碼塊里語句(*p)(a,b)可以用 p(a,b) 來代替,因為p和sum就是一樣的,可以通用,只是用前者可能更容易理解一點。

而我們要知道怎樣定義一個指針指向函數,int (*p)(int,int)這是固定寫法,前面的int是指針將來指向的函數的返回值的類型,如果沒有函數返回值,那就是void,后面括號里的兩個int當然就是指針將指向的函數的形參。

/*函數指針的意義

1. 便於分層設計:函數指針是引用,是間接層,或曰隔離層。它輸出到上層,給上層用戶用。函數實體是實現,在下層,給開發者用,實現者(軟件工程師)關注。這就是簡單的分層的概念了。上層用戶想讓一個函數所做的東西會變化時,我們只需要改變底層實現,並用函數指針指向新的實現就行了。

再精煉一下分層:分層的核心是對接口進行設計和實現。函數指針的作用就是提供不同實現的統一接口。

2. 利於系統抽象:只有存在多個類似的實體需要模擬、操作或控制時(這種情況很多)才需要抽象。多個類似的實體就是對象,抽象的結果就是類。在C里邊,可以用函數指針數組完成這種抽象。如, fopen 就是一個例子。他可以打開文件。C里面將磁盤文件、串口、USB等諸多設備抽象為文件。

3. 降低耦合度以及使接口與實現分開:第1條中的解釋已經說明了這一點。

*/

 

5、指針指向結構體:

我們首先首先定義一個結構類型,

struct student

{char *name;

int  ages;};

再根據類型定義結構體變量struct student stu={"Rose",15};

定義一個指針指向結構體類型,struct student *p;把結構體變量stu的地址賦給指針變量p,p=&stu;

我們可以有3種方式來訪問結構體中的屬性ages:stu.ages=15;(*p).ages=15;p->ages=15;不過第三種方式在C語言中只能用來指向結構體。

以下 3 種形式是等價的:

  • 結構體變量.成員名。

  • (*指針變量).成員名。(括號不能省略)

  • 指針變量->成員名。

  •  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM