1. 程式人生 > 其它 >C++指標

C++指標

技術標籤:c++c++指標

指標變數裡存放地址,地址裡的內容是真正的資料

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;
 
 *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;
}