1、指標概念理解
int* p 定義一個指標(推薦使用這種寫法int* ,理解上有好處)
p 指標變數;
* 間接運算子(訪問符),代表訪問該地址所指向的空間;
*p 指標所保存(指向)的地址中對應(指向)的值;
&p 獲取指標變數的記憶體地址(指標本身占用記憶體空間);
故 指標是
(1)通過間接的方式訪問記憶體空間(直接方式是通過變數名稱(記憶體空間名字)直接訪問空間);
(2)指標是一種保存變數記憶體地址的變數,自身也占用記憶體空間,
eg:
指標初始化的兩種方式
int a = 40; //指標初始化方式第一種寫法 int* p;//p是指標變數,而不是*p p = &a;//指標變數用來存放記憶體地址;注意,此處使用*p = &a是錯誤的定義,應該是對p(指標變數)賦值,而不是*p(指標保存的地址指向的值) //指標初始化方式第二種寫法,實質是第一種寫法的簡化方式, int* p1 = &a; cout << " &p--對指標變數取地址--輸出指標變數的地址:" << &p << endl; cout << " *p--該指標保存的地址對應的值--輸出指標所存放的地址對應的在堆記憶體中的值:" << *p << "\n";
2、宣告指向int型別的指標,即指標包含的地址對應的記憶體單元存盤了一個整數
int* p = NULL;
3、使用 指標 存盤 由地址運算子& 獲取的地址
int age = 30; int* pa = &age; cout << "*pa = " << *pa << endl; cout << "pa = " << pa << endl; //age的記憶體地址 cout << "&age = " << &age << endl; cout << "指標自身的地址----&pa = " << &pa << endl; //指標自身的地址
4、const指標
int day = 30; int* const pDay = &day; //指標包含的地址是常量---常量指標 cout << pDay << endl; int hour = 24; const int* pHour = &hour; //指標指向的資料是常量---指向常量的指標 cout << pHour << endl; int h = 24; const int* const ph = &h; //指標包含的地址以及指向的值都是常量---指向常量的常量指標 cout << ph << endl;
5、 宣告指向記憶體塊的指標,即void指標
void 指標是一種特殊的指標,表示為“無型別指標”,由于 void 指標沒有特定的型別,因此它可以指向任何型別的資料,也就是說,任何型別的指標都可以直接賦值給 void 指標,而無需進行其他相關的強制型別轉換,
eg:
void* p1; int* p2; p1 = p2; p2 = (int* )p1;
6、野指標:
把沒有合法指向的指標稱為“野”指標,因為“野”指標隨機指向一塊空間,該空間中存盤的可能是其他程式的資料甚至是系統資料,故不能對“野”指標所指向的空間進行存取操作,否則輕者會引起程式崩潰,嚴重的可能導致整個系統崩潰,
eg:
int *pi,a; //pi未初始化,無合法指向,為“野”指標 *pi=3; //運行時錯誤!不能對”野”指標指向的空間做存入操作,該陳述句試圖把 3 存入“野”指標pi所指的隨機空間中,會產生運行時錯誤, a=*pi; //運行時錯誤!不能對”野”指標指向的空間取操作,該陳述句試圖從“野”指標pi所指的空間中取出資料,然后賦給變數a同樣會產生運行時錯誤,
7、指標運算
eg:
int* p = 4;
p++;

指標變數 p 進行 p++,p 是一個 int 型別的指標,指向記憶體地址 0x10000008 處,則 p++ 將指向與 p 相鄰的下一個記憶體地址,由于 int 型資料占 4 個位元組,因此 p++ 所指的記憶體地址為 1000000b,這種運算并不會改變指標變數 p 自身的地址,只是改變了它所指向的地址(存放的地址),
8、補充:
c++指標記憶體空間釋放
int* pb = new int; int* pb2 = new int[4]; delete pb; delete[] pb2;
9、陣列與指標:
(1)一維陣列和指標
int* p,a[10] = {1,2,3,4,5};
p = a;//p指向陣列a的首地址,即p=&a[0],陣列名相當于陣列首元素的地址a[0] //陣列的訪問方式 //1、直接訪問---陣列名[下標] cout << a[1] << "\n"; //2、間接訪問---*(陣列名+i) cout << *(a+2) << endl;// a+2表示陣列首地址向后移動2個位置,a+2相當于&a[2] //3、間接訪問--- *(指標變數) for (int i=0; i<10; i++) { cout << * p++ << endl;//++運算子的優先級要高于* }
指標陣列:存盤指標的陣列,int* p[5]
int a0,a1,a2,a3; int* b[5]; b[0] = &a0; b[1] = &a1; b[2] = &a2;
陣列指標:指向一維陣列的指標,int (*p)[5]
int c[3][4]; int (*p)[4];//定義一個陣列指標,指向含4個元素的一維陣列 p = c;//二維陣列的首地址賦給p,即a[0],或&a[0][0]
(2)二維陣列
int* p;
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
p = &a[0][0]; //通過陣列下邊直接訪問 /* * 通過地址間接訪問,即*(*(a+i)j)的形式,二維陣列可看成由特殊一維陣列組成的一維陣列,a[i]可看成一個由N列組成的一維陣列, a表示a[0][0]的地址 * a[i]等價于*(a+i),表示i的首行地址,i行對應的一維陣列的陣列名, * a[i]+0 <---> *(a+i)+0 <---> &a[i][0] * a[i]+j <---> *(a+i)+j <---> &a[i][j] * 地址即指標,通過間接運算子*,可以訪問記憶體空間,則 * *(a[i]+j) <---> *(*(a+i)+j) <---> *&a[i][j] <---> a[i][j] */ cout << "a[0][0]的地址:" << a << endl; cout << "a[0][1]的地址:" << a+1 << endl; cout << "a[1][0]的地址:" << a[1]+0 << endl; cout << *(a+1)+0 << endl; cout << &a[1][0] << endl;
10、函式與指標:
(1)指標函式,函式回傳呼叫者某個地址即指標型別;
char* str_cat(char* c1, char* c2){ char* p1 = c1; char* p2 = c2; while (*p1!='\0'){ p1++; } *p1++=' '; while (*p2!='\0'){ *p1++=*p2++; } return c1;//回傳結果為指標型別
}
(2)函式指標---指向函式的指標
int* pf (int, int);//函式的回傳值為int指標型別,int* int (*pf1) (int, int);//函式指標變數pf,可以指向任意含有兩個整形引數,且回傳值為整形的函式 pf = &fun; pf = fun;//可以不用取地址,一個函式識別符號就代表了它的地址
呼叫函式指標的方式兩種方式
x = (*func)();
x = func();
非常感謝您的閱讀,如需轉載,請注明出處,本文鏈接https://www.cnblogs.com/huyangshu-fs/p/11617216.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/100186.html
標籤:C++
上一篇:長樂國慶集訓Day1
