作者:fan wang

鏈接:zhihu.com/question/3102來源:知乎著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。一圖勝千言

1. 聲明變數:C語言聲明一個變數時,編譯器在內存中留出一個唯一的地址單元來存儲變數,如下圖,變數var初始化為100,編譯器將地址為1004的內存單元留給變數,並將地址1004和該變數的名稱關聯起來。

2.創建指針:變數var的地址是1004,是一個數字,地址的這個數字可以用另一個變數來保存它,假設這個變數為p,此時變數p未被初始化,系統為它分配了空間,但值還不確定,如下圖所示。

3.初始化指針,將變數var的地址存儲到變數p中,初始化後(p=&var),p指向var,稱為一個指向var的指針。指針是一個變數,它存儲了另一個變數的地址。

4.聲明指針:typename *p 其中typename指的是var的變數類型,可以是 short ,char ,float,因為每個類型佔用的內存位元組不同,short佔2個位元組,char佔1個位元組,float佔4個位元組,指針的值等於它指向變數的第一個位元組的地址 。*是間接運算符,說明p是指針變數,與非指針變數區別開來。5. *p和var指的是var的內容;p和&var指的是var的地址

6.既然指針*p的值等於var,p的值等於&var,為什麼要多發明這一個指針符號增加記憶量呢。指針主要的功能有兩個:避免副本和共享數據。指針的重要功能是函數之間傳遞參數。talk is cheap, show me the code! 假設用c語言設計一個遊戲,控制人物向前走的函數為 go_forward(),這個函數接收遊戲人物的坐標(int x,int y) 兩個變數,對這兩個變數進行加減操作。#include <stdio.h>void go_forward(int position_x,int position_y){

position_x=position_x+1;

position_y=position_y+1;}int main(){ int x=0; int y=0; go_forward(x,y); printf("當前坐標為:%d,%d
",x,y);return 0;

}

你希望執行go_forward()函數後x,y坐標都+1,輸出為(1,1),但是結果還是(0,0)原因為C語言調用函數的方式是按值傳遞參數,以x參數為例,剛開始main函數中有一個x的局部變數,值為0,當計算機調用go_forward()函數時,它將變數x的值複製給了參數position_x,這只是一個賦值過程將變數x賦值給變數position_x,相當於 position_x=x 命令,而這個命令,x的值是不發生變化的,結果如下圖所示,x的值仍為0,position_x的值變為1。

解決方法,傳遞指針,用指針告訴go_forward()函數參數x的值的地址,go_forward()函數就能修改對應地址中的內容。所以用指針的主要原因是讓函數共享存儲器,一個函數可以修改另一個函數創建的數據,只要提供數據在內存中的地址,修改代碼如下。#include <stdio.h>void go_foward(int *position_x,int*position_y){ *position_x=*position_x+1; *position_y=*position_y+1;

}

int main(){ int x=0; int y=0; go_forward(&x,&y); printf("當前坐標為:%d,%d
",x,y); return 0;}

運行結果:當前坐標為:1,1
推薦閱讀:
相关文章