硬核乾貨!指標!!!(6)

2021-09-29 16:33:46 字數 3610 閱讀 7779

指標即記憶體位址!

指標即記憶體位址!

指標即記憶體位址!

(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 來判斷是否可以進行*運算

如果定義的指標變數暫時不知道儲存哪個位址,可以初始化為null(空指標), 代表記憶體0位址

一般用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期...

保研雜記(中)硬核乾貨篇

生活不止眼前的苟且,還有詩和遠方。以平和的心態去迎接每一天,驀然回首,每一天都會有滿滿的收穫。幹完雞湯,接下來分享點實惠的乾貨。自己總結,僅供參考,若有不妥之處,諸位莫見笑。正所謂未見其人先觀其書,簡歷是文案方面的重頭戲。老師對學生的第一印象往往 於簡歷,因此懂得如何包裝自己能增加贏得老師青睞的可能...