指標即記憶體位址!
指標即記憶體位址!
指標即記憶體位址!
(1)程式對記憶體位址進行編號[0,4g] (本質上是乙個整數)
(2)儲存乙個位址需要4位元組的空間
(3)sizeof(指標) == 4
seziof(char *) == 4位元組二:指標變數seziof(short *) == 4位元組
seziof(int *) == 4位元組
seziof(float *) == 4位元組
seziof(double *) == 4位元組
任何指標求seziof都是4個位元組
指標變數的定義
資料型別 * 變數名;
int
* p;
//int * 是乙個整體,表示型別為指標型別,int表示指標變數儲存的是整數型別資料的位址
int*p1,p2;
//p1是 int * 型別 ,p2是int型別
int*p3,
*p4;
//p3和p4都是 int * 型別
指標變數的初始化
(1)野指標:未初始化的指標變數稱為 野指標(非常危險)
注意:(2)空指標:儲存null的指標變數稱為空指標在程式設計過程中,一定要杜絕 野指標
如果對野指標取 * 運算,可能會得到意想不到的資料,也可能直接導致程式崩潰
注意:如果定義的指標變數暫時不知道儲存哪個位址,可以初始化為null(空指標), 代表記憶體0位址空指標不能取 * 運算
所以經常用 指標變數!=null 來判斷是否可以進行*運算
一般用null來判斷乙個指標是否指向有效的記憶體
判斷指標型別是否可以進行 * 運算:
if
(指標變數 !=
null
)
指標變數的操作
(1)對於任何變數都可以進行& (取位址運算子)
(2)對於指標變數而言,可以進行* (取值運算子)
int n =10;
int*p =
&n;//指標變數儲存的是 &n ,n變數的記憶體位址
*p ==*(
&n)== n
*p =
119;
//相當於 n=119;
int m =20;
p =&m;//改變了指標變數p的值
p = ***;
//是對指標變數賦值 改變指標的指向
*p = yyy;
//是對指標變數所儲存的記憶體位址裡那個記憶體資料的賦值
注意:連續在一起的運算子*& 和 &* 是可以相互抵消的 。
(3)[ ] 下標運算子
int arr[10];陣列名,代表 陣列首元素的位址
arr[i] == *(arr+i) == *(i+arr) == i[arr]
&arr[0] == &(*(arr+0)) == &(*arr) == arr
arr[0] == *(arr+0) == *arr
&arr 和 arr ,顯示的位址是一樣的,但是型別不一樣
int arr[10]
; arr +1;
//偏移了4個位元組 arr首元素的位址 每+1 偏移了乙個元素的記憶體位址
&arr +1;
//偏移了40個位元組 &arr陣列的位址 每+1 偏移了整個陣列的記憶體地
(4)+ - 指標加減法
指標 + 1 :其實是加了乙個「單位」長度的位元組數 單位的位元組數取決於指標的型別
char * 單位: 1位元組
short * 2位元組
int * 4位元組
float * 4位元組
double * 8位元組
(5)*p++ 和 (*p)++
*p++ 表示式的結果是 *p 的結果,然後 p=p+1
(*p)++ 表示式的結果是 *p 的結果,然後 *p=*p+1
(6)形參:int arr [ ] 或 int arr [n] 實際上都相當於 int *arr
void
func
(int arr)
//陣列名在傳遞過程中,退化為乙個指標,所以陣列在傳遞時需要傳遞陣列的長度
(7)萬能指標:void *
void的作用:不同型別的指標之間,如果進行賦值,會報警告① 函式返回值型別 表示函式沒有返回值
② 函式引數列表 表示函式不能接收任何引數
③ void * 萬能指標
任何型別的指標(位址)都可以賦值給 void * 指標變數
任何型別的指標都可以有 void * 相互轉換且不報警告
指標的功能
c語言函式的傳參方式是值傳遞的方式
(實參的值賦值給形參,修改形參的值並不影響實參的值)
c語言函式傳遞記憶體位址,在函式裡面通過修改該記憶體位址裡面的資料達到修改實參的目的
int n =
110;
//宣告乙個變數 分配記憶體 記憶體中的資料為110 用n標識
int*p =
&n;//宣告乙個指標變數 分配記憶體 記憶體中儲存的資料為 變數n的位址
*p =1;
// *p 取得 *(&n) n 修改n的值為1
int m =
119;
p =&m;//修改p變數的值
*p =
9527
;// *p *(&m) m 修改m的值為9527
int x =
0x12345678
;char
*p =
(char*)
&x;// 強制轉換 x的型別變為char
利用指標來交換兩數的值:
//不要指標,只交換形參位元組的值 根本就不影響實參
void
swap_0
(int a,
int b)
//正確 交換了*pa和*pb的值 ,實參的值改變
void
swap_1
(int
*pa,
int*pb)
//交換了pa和pb的值 pa和pb所儲存的那兩個位址裡面的資料沒有交換過
void
swap_2
(int
*pa,
int*pb)
//*p是野指標 非常危險
void
swap_3
(int
*pa,
int*pb)
硬核乾貨!初識Linux(1)
在這第乙個星期的學習中,因為需要在oracle vm virtualbox虛擬機器上的ubuntu上進行操作,所以先是了解了linux的一些背景以及一些日常使用到的基礎命令。在pc端,目前的作業系統主要有著windows mac os 以及unix三大操作系,而linux是unix作業系統的最重要的...
硬核乾貨演算法文章彙總
17.持續更新.16.目標檢測演算法 第16期 yolo v2演算法結構詳解 15.目標檢測演算法 第15期 yolo v1損失函式詳解 14.目標檢測演算法 第14期 yolo v1檢測演算法詳解 13.目標檢測演算法 第13期 ssd檢測演算法必須知道的幾個關鍵點 12.目標檢測演算法 第12期...
保研雜記(中)硬核乾貨篇
生活不止眼前的苟且,還有詩和遠方。以平和的心態去迎接每一天,驀然回首,每一天都會有滿滿的收穫。幹完雞湯,接下來分享點實惠的乾貨。自己總結,僅供參考,若有不妥之處,諸位莫見笑。正所謂未見其人先觀其書,簡歷是文案方面的重頭戲。老師對學生的第一印象往往 於簡歷,因此懂得如何包裝自己能增加贏得老師青睞的可能...