指標變數與變數位址

2021-08-02 18:41:26 字數 1927 閱讀 5994

一、基本概念

儲存單元一般應具有儲存

資料和讀寫資料的功能,以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上編譯時都只會...