C++指標
阿新 • • 發佈:2021-01-08
指標變數裡存放地址,地址裡的內容是真正的資料
1. 指標概念
int i=30; char a='t';
int* pi;
指標也是變數
在32位系統中,指標的寬度是4位元組寬(32bit)
pi = &i;
把i地址的編號賦值給pi
cout<<*pi;//地址的內容
cout<<pi;//地址,&i
如何看指標型別?
眾多文章都列舉了各種型別的指標,對於它們的解析也很簡單。
看優先順序!!
() > [] > *
例如:
int *p[3]; 先是陣列,後*即陣列元素是指標,再int 指標指向的型別是int
2. 二級指標
指向指標的指標。通過二級指標間接訪問資料,改變一級指標的指向問題。
int i = 30;
int *pi = &i;
int **ppi = π
*pi=10;
改變一級指標的值
int j=40;
*pi=&j;
cout<<**ppi<<endl;
改變一級指標的指向
3. 指標與陣列
- 指標陣列 陣列每個成員是指標
char * ch[10];
二級指標和指標陣列等價
char **p;
char* array[N]; array = &array[0]; //array[0] 本身是 char*型;
char **p = array;
- 陣列指標 指標指向一個數組
char (*ch)[10];
討論:a 和&a 之間的賦值區別?
char a[5]={'A','B','C','D'};
char (*p3)[5] = &a;
char (*p4)[5] = a;
&a 是`整個陣列的首地址
a 是陣列首元素的首地址
其值相同但意義不同,p3 這個定義的“=”號兩邊的資料型別完全一致,而p4 這個定義的“=”號兩邊的資料型別就不一致了
所以p4會有警告!
指標變數和整數加減?
是指標變數的地址與指標型別大小*整數;
4. void* 指標
一種特殊的指標型別,可用於存放任意物件的地址。
- 如果要把 void 型別的指標賦值給其他型別的指標,需要進行顯式轉換
- void指標只有強制型別轉換後才可以正常對其操作
因為對該地址中到底是個什麼型別的物件並不瞭解,因此不能直接操作 void* 指標所指的物件。
只能以 void* 的視角來看記憶體空間也就是僅僅是記憶體空間,沒辦法訪問記憶體空間中所存的物件,因此只有對其進行型別轉換之後才可以對其進行相應的訪問
5. 函式與函式指標
當需要通過函式返回值來判斷函式呼叫是否成功,又需要把資料傳遞出來,此時,我們就要用到多參返回,多參返回都是通過傳遞呼叫空間中的空間地址來實現的
- 函式的本質是一段可執行性程式碼段。函式名,則是指向這段程式碼段的首地址
void print()
{
printf("china\n");
}
int main()
{
void (*pf)() = print; //void (*pf)() = &print;
pf(); //(*pf)();
pf = dis;
pf();
return 0;
}