7.1位址和指標的概念
程式中只需指出變數名,無需知道每個變數在記憶體中的位址,每個變數與具體位址之間的聯絡由c編譯系統來完成。
記憶體單元內容:
printf("%d",i):根據變數名與位址的對應關係,關係在編譯時就已經確定,找到變數i的位址,然後由位址開始的4個位元組中取出資料,即變數的值,把它輸出。
將變數i的位址存放在另外乙個變數中,然後通過該變數來找到變數i的位址,從而訪問變數i,稱為間接訪問方式。
乙個變數的位址就是該變數的指標。
7.2指標變數
7.2.1 指標變數的定義
指標變數也是乙個變數,必須先定義後使用。
定義指向變數的指標變數的格式:型別識別符號 *變數名;
例如:int i,j,*p
定義整形變數i,j,還定義了指標變數p,指標變數名前的"*"號僅是乙個符號,並不是指標運算子,表示定義的p的指標變數;
型別識別符號:表示該指標變數所指向的變數的資料型別,並不是指標變數自身的資料型別,所有指標變數都是存放變數位址的。
所有指標的型別相同,只是所指向的變數的資料型別不同。
為了找到變數的位址,可以使用&(取位址)運算子。如果i是變數,那麼&i就是i在記憶體中的位址。獲得指標所指物件的訪問,可以使用*(間接定址)運算子。
如果p是指標,那麼*p就是p當前指向物件的內容。
例:int i=3;*p;
p=&i;
程式的第一句int i=3;*p; 定義了乙個整型變數i和乙個整型的指標變數p;i的初值為3,當執行p=&i之後,p指向i。此時&i就是i在記憶體中的位址,*p就是p當前所指向變數i的儲存空間裡面的內容。
7.2.2 指標變數的引用
在定義了指標變數之後,就可以對該指標變數進行各種操作。
例:7-1;
#include "stdio.h"
main()
7.2.3 指標變數作為函式的引數
位址呼叫的方法,在函式呼叫的時候,不能向形參傳遞變數的內容,而傳遞變數的位址,只有得到變數的位址,才能利用間接定址方式在函式中去改變相應的位址單元中的資料值。利用指標變數作為函式的引數。
① 函式呼叫時,系統臨時建立形參指標變數
② 實參將其位址複製乙份給形參,於是形參指標變數與實參變數間建立了「指向」關係,即形參指令變數指向了實參所對應的儲存空間
③ 函式呼叫過程中,利用形參指標變數間接地引用或修改實參對應儲存空間中地數值
④ 當被調函式執行結束返回主調函式時,形參指標變數自動釋放。注意:此時釋放的是形參所占地臨時儲存空間,而不是釋放實參所對應的儲存空間。
適用場合:
① 如果主調函式中有數值需要利用被調函式為其修改,則採用位址傳遞方式,將需要修改數值的變數位址作函式實參
② 位址傳遞方式還經常用於被調函式執行結束後,向主調函式帶回多個執行結果的場合。由於函式的返回值每次僅能向主調函式帶回乙個數值,當有多個數值需要帶回主調函式時,應採用位址傳遞方式
函式的呼叫不能改變實參指標變數的指向,但可以改變實參指標變數所指向的儲存空間中的值。
例子:輸入3個數,輸出其中的最大整數和最小整數。
#include "stdio.h"
main()
void max(int *da,int *db,int *dc)
if(*db>*da&&*db>*dc)
if(*dc>*da&&*dc>*db)
printf("最大值為:%d\n",t);
}void min(int *xa,int *xb,int *xc)
if(*xb
if(*xc
printf("最小值為:%d\n",t);
}
7.3指向指標的指標指標不但可以指向基本型別的變數,還可以指向指標變數,這種指向指標型別資料的指標變數稱為指向指標的指標,或稱多級指標。
二級指標定義形式:
型別識別符號 **變數名
例子:int a,*p,**p;
a=22;
p=&a;
pp=&p;
二級指標與一級指標是兩種不同的資料型別,儘管它們都是位址,但不可以相互賦值。
菜鳥C 學習筆記 16 位址和指標
includeusing namespace std int main 注意 不同的編譯器輸出的結果是不一樣的。2 指標 用於直接對記憶體進行操作 定義方法 在指標變數前加星號 例如 includeusing namespace std int main int i 1 int p 注意這個指標變數...
第10章 指標 四 位址簿 指標變數
在本章前幾節中,我們已經了解了什麼是位址,什麼是首位址 指標 進而知道了什麼是首位址型別 指標型別 下面,我們就把變數或函式的首位址 存入到計算機 的位址簿中 在計算機 程式中,無論是記錄變數 的首位址,還是函式 的首位址,都需要建立計算機所特有的位址簿。好,讓我們來開始建立吧。一 指標變數 前面的...
IPV6位址壓縮 C
題目要求 給定一組ipv6位址 unsigned 0x 以文字形式輸出壓縮後的位址 一般要求 注 若有超過兩個地方有連續0,選擇較長的那個進行壓縮 輸入 1234 0abc 0000 0078 ff00 0000 0030 0005 2001 0db8 0000 0000 0001 0000 000...