共享内存 传一个类指针_C++指针
簡介
指針一直是C語言和C++語言最難理解的一部分,無論是C語言和C++語言,復雜的數據結構都是離不開指針的運用,所以必須掌握好指針這個數據類型,你才能夠在閱讀框架代碼時,游刃有余。今天我們從指針的本質來重新理解指針這個數據類型。
1.指針的本質
指針是用來保存地址的一個變量,那么變量都是保存在內存中,而內存其實就是一組有序字節組成的數組,每個字節有唯一的內存地址。CPU 通過內存尋址對存儲在內存中的某個指定數據對象的地址進行定位。說白了,CPU就是通過地址去查找存儲在內存中的數據。下面我們看看如下示意圖:
這是一個 4GB 的內存,可以存放 2^32 個字節的數據。左側的連續的十六進制編號就是內存地址,每個內存地址對應一個字節的內存空間。而指針變量保存的就是這個編號,也即內存地址。指針本身也是有內存地址來保存這個變量的。
2.為什么要使用指針
在C語言中,指針的使用非常廣泛,因為使用指針往往可以生成更高效、更緊湊的代碼。總的來說,使用指針有如下好處:
1)指針的使用使得不同區域的代碼可以輕易的共享內存數據,這樣可以使程序更為快速高效;
2)C語言中一些復雜的數據結構往往需要使用指針來構建,如鏈表、二叉樹等;
3)C語言是傳值調用,而有些操作傳值調用是無法完成的,如通過被調函數修改調用函數的對象,但是這種操作可以由指針來完成,而且并不違背傳值調用。
3.指針定義和初始化
下面我們再來看看下面例子:
int a = 100;
int *p = &a;
int **p2 = &p1;
p2? ? ? ? p1? ? ? ?a
&p1? ?->? &a? ?->? 100
為了方便理解,我們來打個比喻:
定義的a,p,p2都是一個盒子,他們都有自己地址空間,方便別人找到它
a是一個盒子,用來裝100這個數據,a本身有地址;
p也是一個盒子,用來裝a的地址,p本身也有地址;
P2也是一個盒子,用來裝p的地址,p2本身也有地址;
a和p和p2變量本身都是代表盒子里面的東西
=》盒子里面裝可能是值,也可能是地址,例如a就是值,p和p2都是地址;
“*”的操作(只對指針變量),就是取出盒子里面地址,去打開另一個盒子那東西
=》相當于,從抽底里面取出一把鑰匙,去打開另一個抽底去拿東西一樣。
指針的聲明比普通變量的聲明多了一個一元運算符 “*”。運算符 “*” 是間接尋址或者間接引用運算符
總結如下:
3.1.指針也是一種數據類型,也占用內存空間
1) 指針是用來干嘛?
=>指針是用來存放地址的, 這個地址(p=&a)可以指向"int"型內存空間
例如定義:int a;//我們知道a是用來存儲整型數據的
例如再定義int *p;? //那么,指針也是一種數據類型,也可以用來定義變量
2)指針本身也有地址,也占用內存空間
=>指針定義時(int *p)不占用內存空間,當其賦值(p=&a)時分配內存空間
3.2.一級指針: p 和 *p區別
"p"操作:
其實就是直接取出它內存空間里面值(只不過指針變量p存儲空間存放的是一個地址);
"*p"操作:
第一步,p操作,先去取出p存儲空間里面的地址(p存儲的是一個地址);?
第二步,*P操作,再把這塊地址里面值取出來;
3.3.二級指針: p2 和 *p2 和 **p2操作順序
第一步: p2, p2操作,先取出p2內存空間里面值,得到的這個值是一級指針的地址;
第二步: *p2, 再*p2操作, 取出一級指針內存空間里面的值(一級指針內存空間里面的值還是個地址,例如變量a地址);?
第三步:**p2, 再**p2操作, 得到變量a的值;
#include "iostream"using namespace std;void main(){ int a = 100; int *p = &a; int **p2 = &p; //int ***p3 = &p2; //1.取值, 打印 printf("取值, 打印:%d, %d, %d\n", a, *p, **p2); //2.取地址, 打印 =>指針也是有地址的 printf("取地址, 打印:&a=%#x, &p1=%#x, &p2=%#x\n",&a, &p, &p2); //3.打印地址,對比 //=>p 和 &a打印都是同樣地址,因為p是用來存放a的地址 printf("打印地址,對比:p=%#x, &a=%#x\n", p, &a); //p2 和 &p打印都是同樣地址,因為p2用來存儲&p地址 //=>*p2 和 &a打印都是同樣地址,因為*p2取就是p存儲單元里面值(即使a地址) printf("打印地址,對比:p2=%#x, &p=%#x ,*p2=%#x, &a=%#x\n", p2, &p, *p2, &a); system("pause"); return;}最后輸出結果:
推薦閱讀:
專輯|C++專輯
專輯|Camera專業知識
專輯|攝像頭行業動態
專輯|程序人生
總結
以上是生活随笔為你收集整理的共享内存 传一个类指针_C++指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++入门代码_C/C++编程笔记:C语
- 下一篇: java二维矩阵怎么进行转置_矩阵求导的