指標的概念:
在計算機儲存中,所有的資料都儲存在儲存器中,所謂的1位元組也被稱作乙個記憶體單元.
不同的資料型別在儲存器中所占用的記憶體單元是不同的.
整形變數 如 int佔2個單元
字元變數 如 char佔1個單元
為了準確的訪問到每個記憶體單元,獲取記憶體單元中儲存內容,計算機將每個記憶體單元都分配了乙個編號,也就是位址.
根據記憶體單元位址找到正確的記憶體單元,我們就把這個記憶體單元位址稱為指標.
在指標所指向的記憶體單元中即可找到對應儲存內容.
指標與指標變數不同之處在於: 指標 所指的是位址,是常量. 指標變數 所指的是取值為位址的變數.
變數的指標就是變數的位址。存放變數位址的變數是指標變數。即在c語言中,允許用乙個變數來存放指標,這種變數稱為指標變數。因此,乙個指標變數的值就是某個變數的位址或稱為某變數的指標。
為了表示指標變數和它所指向的變數之間的關係,在程式中用「*」符號表示「指向」,例如,i_pointer代表指標變數,而*i_pointer是i_pointer所指向的變數。因此,下面兩個語句作用相同:
i=3;
*i_pointer=3;
第2個語句的含義是將3賦給指標變數i_pointer所指向的變數。
定義乙個指標變數
對指標變數的定義包括三個內容:
指標型別說明,即定義變數為乙個指標變數;
指標變數名;
變數值(指標)所指向的變數的資料型別。
其一般形式為:
型別說明符 *變數名;
其中,*表示這是乙個指標變數,變數名即為定義的指標變數名,型別說明符表示本指標變數所指向的變數的資料型別。
例如:
int *p1;
表示p1是乙個指標變數,它的值是某個整型變數的位址。或者說p1指向乙個整型變數。至於p1究竟指向哪乙個整型變數,應由向p1賦予的位址來決定。
再如:
int *p2; /*p2是指向整型變數的指標變數*/
float *p3; /*p3是指向浮點變數的指標變數*/
char *p4; /*p4是指向字元變數的指標變數*/
應該注意的是,乙個指標變數只能指向同型別的變數,如p3 只能指向浮點變數,不能時而指向乙個浮點變數,時而又指向乙個字元變數。
指標變數的引用
指標變數同普通變數一樣,使用之前不僅要定義說明,而且必須賦予具體的值。未經賦值的指標變數不能使用,否則將造成系統混亂,甚至宕機。指標變數的賦值只能賦予位址,決不能賦予任何其它資料,否則將引起錯誤。在c語言中,變數的位址是由編譯系統分配的,對使用者完全透明,使用者不知道變數的具體位址。
兩個有關的運算子:
&:取位址運算子;
*:指標運算子(或稱「間接訪問」 運算子)。
c語言中提供了位址運算子&來表示變數的位址。其一般形式為:
&變數名;
如&a表示變數a的位址,&b表示變數b的位址。變數本身必須預先說明。
設有指向整型變數的指標變數p,如要把整型變數a 的位址賦予p可以有以下兩種方式:
指標變數初始化的方法:
int a;
int *p=&a;
賦值語句的方法:
int a;
int *p;
p=&a;
不允許把乙個數賦予指標變數,故下面的賦值是錯誤的:
int *p;
p=1000;
被賦值的指標變數前不能再加「*」說明符,如寫為*p=&a 也是錯誤的。假設:
int i=200, x;
int *ip;
我們定義了兩個整型變數i、x,還定義了乙個指向整型數的指標變數ip。i、x中可存放整數,而ip中只能存放整型變數的位址。我們可以把i的位址賦給ip:
ip=&i;
此時指標變數ip指向整型變數i,假設變數i的位址為1800,這個賦值可形象理解為下圖所示的聯絡。
以後我們便可以通過指標變數ip間接訪問變數i,例如:
x=*ip;
運算子*訪問以ip為位址的存貯區域,而ip中存放的是變數i的位址,因此,*ip訪問的是位址為1800的存貯區域(因為是整數,實際上是從1800開始的兩個位元組),它就是i所占用的存貯區域,所以上面的賦值表示式等價於:
x=i;
另外,指標變數和一般變數一樣,存放在它們之中的值是可以改變的,也就是說可以改變它們的指向,假設
int i, j, *p1, *p2;
i='a';
j='b';
p1=&i;
p2=&j;
則建立如下圖所示的聯絡。
這時賦值表示式:
p2=p1;
就使p2與p1指向同一物件i,此時*p2就等價於i,而不是j,圖所示。
如果執行如下表示式:
*p2=*p1;
則表示把p1指向的內容賦給p2所指的區域,此時就變成下圖所示。
通過指標訪問它所指向的乙個變數是以間接訪問的形式進行的,所以比直接訪問乙個變數要費時間,而且不直觀,因為通過指標要訪問哪乙個變數,取決於指標的值(即指向),例如"*p2=*p1;"實際上就是"j=i;",前者不僅速度慢而且目的不明。但由於指標是變數,我們可以通過改變它們的指向,以間接訪問不同的變數,這給程式設計師帶來靈活性,也使程式**編寫得更為簡潔和有效。
指標變數可出現在表示式中,設
int x, y, *px=&x;
指標變數px指向整數x,則*px可出現在x能出現的任何地方。例如:
y=*px+5; /*表示把x的內容加5並賦給y*/
y=++*px; /*px的內容加上1之後賦給y,++*px相當於++(*px)*/
y=*px++; /*相當於y=*px; px++*/
【例10-1】
main()
對程式的說明:
在開頭處雖然定義了兩個指標變數pointer_1和pointer_2,擔它們並未指向任何乙個整型變數。只是提供兩個指標變數,規定它們可以指向整型變數。程式第4、5行的作用就是使pointer_1指向a,pointer_2指向b。
最後一行的*pointer_1和*pointer_2就是變數a和b。最後兩個printf函式作用是相同的。
程式中有兩處出現*pointer_1和*pointer_2,請區分它們的不同含義。
程式第4、5行的「pointer_1=&a」和 「pointer_2=&b」不能寫成「*pointer_1=&a」和 「*pointer_2=&b」。
請對下面再的關於「&」和「*」的問題進行考慮:
如果已經執行了「pointer_1=&a;」語句,則&*pointer_1是什麼含義?
*&a含義是什麼?
(pointer_1)++和pointer_1++的區別?
【例10-2】輸入a和b兩個整數,按先大後小的順序輸出a和b。
main()
c語言初學 初涉指標
指標 指標是乙個 4 bytes integers,儲存的是記憶體位址,1.定義 型別 變數名 2.使用const宣告指標變數 1 指向const的指標變數 int const p 等效於 const int p 該類指標變數指向的記憶體空間的內容是不可變的。eg.const int a 1 con...
C語言之旅(1)指標
指標是什麼?指標是變數。指標是幹什麼用的?指標是儲存位址的。指標佔多少個位元組?對於32位系統來說是4個位元組,對於64位系統來說是8個位元組,當前大多數用的還是32位系統。這裡面說的系統不是計算機的作業系統,而是計算機架構的定址能力。對於32位系統來說計算機的位址用8位16進製制數表示。因為一位1...
c語言基礎(二)指標篇
定義乙個int型別的變數i int i 10 定義乙個int型別的一級指標變數 int p 把i對應的位址賦給p變數 p i 指標取值 p 把p變數對應的位址的值取出來 printf p d p 首先我們定義的指標變數p,其實p就是用來存放位址的,我們把i的位址賦給p,那麼p的值其實就是i的位址,p...