一、基本概念
儲存單元一般應具有儲存
資料和讀寫資料的功能,以8位二進位製作為乙個儲存單元,也就是乙個位元組。每個單元有乙個位址,是乙個整數
編碼,可以表示為
二進位制整數。程式中的變數和主儲存器的儲存單元相對應。變數的名字對應著儲存單元的位址,變數內容對應著
單元所儲存的資料。儲存位址一般用十六進製制數表示,而每乙個儲存器位址中又存放著一組二進位制(或十六進製制)表示的數,通常稱為該位址的內容。
變數有三個要素是:變數名、變數型別、變數值。
變數代表了乙個儲存單元,其中的值是可變的,故稱為變數。
二、指標說明
一說到指標的大小很多人都會想到int型,char型,double型,然後覺得不同型別的指標所佔記憶體大小不同,其實這是一種誤區. 指標其實就是乙個形無符號整型,乙個整數而已,它的大小取決於你的系統是16 32 還是64位的 16/8=2byte 32/8=4byte 64/8=8byte .
指標所指向的記憶體塊所佔記憶體大小.char佔乙個位元組,int佔2個位元組,double佔4個位元組,long double佔8個位元組(這是預設的32位編譯環境下,在64位下翻倍就是了),所以乙個char指
針所佔記憶體為4個位元組(32位下),所指向的記憶體區域佔1個位元組.同理其它型別也是一樣的,
操作符:&、*
三、具體分析
1、普通變數:
int n = 64;
cout << endl << "adderse_&n:" << &n << endl << " " << "data_n:" << n << endl << endl;
普通變數變數名即位址中的資料(變數值)。
簡單理解:普通變數名=資料。
2、一級指標變數:
int *a = &n;
cout << endl << "adderse_&a:" << &a << endl << " " << "adderse_a:" << a << endl << " "
<< "adderse_&(*a):" << &*a << endl << " " << "adderse_*(&a):" << *&a << endl << "data_a:" << *a << endl << endl;
一級指標變數:變數名a實際所指的內容為變數n的位址,即a=&n=&(*a)=*(&a);其中*a表示通過a中的內容(n的位址)取值即n。
3、二級指標變數:
int **p;
p = &a;
cout << endl << "adderse_&(*p):" << &(*p) << endl << " " << "adderse_*p:" << *p << endl << " " << "adderse_&p:" << &p << endl << " " << "adderse_p:" << p << endl << " "<< "adderse_&(**p):" << &(**p) << endl << " " << "adderse_**(&p):" << **(&p) << endl << " " << "data_**p:" << " " << **p << endl << endl;
二級指標變數:變數名p所指內容為一級指標的位址=&a=&(*p)=*(&p)=p,該位址(&(*p))中的內容是*p,其中*p中的內容為n的位址=&n=&(**p)=**(&p)=*p
(其中p=&a,a=&n)。
簡單理解:指標變數名=位址---------->位址------------>資料。
其中&(*)和*(&)相互抵消功能。
執行結果:
檢視變數位址
在linux中寫乙個程式,裡面全域性變數,區域性變數,static,const,常數,陣列,輸出這些變數的位址 包括賦值的和沒有賦值的,各類資料型別 如下 include int a int b 1 int const c 1 int const x static int d static int ...
c c 兩個指標變數位址的相減
如下例程 include stdio.h include string.h using namespace std define uint8 t unsigned char define uint16 t unsigned short int define uint32 t unsigned int...
區域性變數位址的返回
char fun 這個函式的返回值?以及這個函式在棧上的儲存布局 include include include char fun int main int argc,const char argv 就函式而言,返回區域性變數的位址這種做法是錯誤的,但是這個函式不管是在vs還是在gcc上編譯時都只會...