目錄
一:指針,指針變量,引用,取地址符:
前提 :
1.“ * ” 的兩種用途
2." & “的兩種用途
2.1:引用
2.2:取地址
補充:
二 : malloc(),動態申請地址空間
1.原型定義 void *malloc(int size);
補充:
三:—> 和 . 作用 區別
1.作用:
2.理解:
一:指針,指針變量,引用,取地址符:
-
符號“ * ” 和 指針變量
-
int *p; #這個代碼的含義是: 創建一個指針變量:p, p是一個指針變量,而p前面的 “ * ” 是在聲明p是一個指針變量
-
*p ; #這個代碼的含義是:解引用 指針變量p (取出指針變量所存的地址中的內容)
-
int &q; #這個代碼的含義是: 創建一個地址變量:q, q是一個地址變量,而q前面的 “ &?” 是在聲明q是一個地址變量
-
&q; #這個代碼的含義是:取地址, 取出變量q的地址 (取出指針變量所存的地址中的內容)
前提 :
-
int e = 10;
-
int a = 5;
1.“ * ” 的兩種用途
-
1.1:解引用:返回指針所指對象的值
-
使用場景: 想要修改指針變量指向地址內容的值時,使用解引用
-
int *p=&a;
-
*p = 50; //此處相當于將 a中內容修改成50;
-
1.2:聲明指針變量:表面該變量是指針變量
-
場景一:
-
int *p;
-
場景二:在形參聲明指針
-
void test1(int* q) {
-
}
-
void main1(){
-
test1(p) ;
-
}
-
當main函數調用test函數時,test1函數空間會開辟一塊新的內存空間,并且創建一個指針變量q,并且將p指針的內容 存放到q指針中(p,q是單獨存在的兩個指針,知識他們存儲的內容是一樣的;)
2." & “的兩種用途
2.1:引用
-
場景一:聲明引用變量
-
int &r = a; #將r 作為a的別名 和 a 一樣(但是不能修改引用)
-
例如 r = 6 : #實質是 先將 a修改成6 然后r的引用也變為6
-
場景二:函數形參聲明 引用變量
-
void test2(參數類型 &y)
-
void main(){
-
test(a); // 相當于 將y作為a的別名,當在test2中 修改y時,實質上的操作是:先修改了a,然后同時 y 的引用也指向 新的 a。
-
}
-
場景三:指針類型 和 引用 同時出現在形參位置
-
void test2(參數類型* &y) //此處表示,一個指針變量y ,將會成為 調用test2 時,傳遞過來參數的引用
-
void main(){
-
int *p=&a;//聲明一個指針變量p,并且將 a的地址賦給p;
-
test2(p);
-
}
-
當main函數調用test函數時,test1函數空間會開辟一塊新的內存空間,并且創建一個指針變量y,此時指針變量y?和 p 是同一個指針,q是p的別名(引用))
2.2:取地址
-
p = &a;
-
int *q = &a;
-
q = &e;//取出e的地址 賦值給指針變量q
-
printf(“%d”,*q);
-
// 10
-
上述操作 當輸出*p 結果應該是 e,但這并不意味著修改了 變量a ,這只是僅僅將指針變量p內的存儲內容從a的地址改為e的地址
補充:
1: int* p,q; 和 int *p,q; //表達相同含義 等價 int *p;int q;
2.二級指針:int "* *p" ; //表示 p是一個二級指針,p存儲的是一個一級指針的地址
“ * * p ” //表示 二級解引用,**p 的值 是 p內存儲一級指針所存儲的地址內存儲的數
舉例: int a = 5;
int *p = &a;
int **q?= &p;
print(q)
// 輸出p的地址
print(*q)
//輸出a的地址
print(**q)
//輸出 a
二 : malloc(),動態申請地址空間
1.原型定義 void *malloc(int size);
malloc()使用 : (數據類型*)malloc(sizeof(數據類型)*申請數據數量)
malloc()返回值: malloc()返回開辟出內存空間的首地址
補充:
1.由malloc定義,其返回對象是指針類型,只能被指針變量接收
2.malloc申請空間使用完成后 需要free(),且free收到參數必須是調用malloc()時?malloc返回的地址空間首地址;
三:—> 和 . 作用 區別
1.作用:
-
A.B 則 A為對象或者結構體; 點號(.):左邊必須為實體。
-
A->B則A為指針,->是成員提取,A->B是提取(*A)中的成員B,A只能是指向類、結構、聯合的指針; 箭頭(->):左邊必須為指針;
補充:聯合體(union) 參考文章:C 語言中的結構體和共用體(聯合體) | 彬彬的博客 (kangzubin.com) 中第二部分
2.理解:
s.member 等價于
(&s)->member (*p).member 即是 p->member (p->member 等價于(*p).member )