C++ 学习 指针
指針
文章目錄
- 指針
- 指針的定義
- 指針的初始化
- 指針的操作
- 解引用操作:
- 指針訪問數組元素
- 指針和const
- 指向const 對象的指針
- const指針
指針的定義
指針定義方式有如下兩種:
<type> *p //如 int *P,推薦使用此種定義方式,不易產生誤解 <type>* P //如 int* P ,不推薦此種方式,易產生誤解int* P0,p1;//只有P0是int型指針,p1不是指針指針的初始化
指針的初始化有四(5)種方式
double dval;double *p = &dval//類型匹配的對象的地址 double *p1 = P //同類型對象的指針 double *p2 = P+3//另一對象之后的地址 double *p3=0 or const int zero =0;double *p3 = zero //字面常量0或者const int 型值為0的常量 double *p4 =NULL //需要包含catdlib頭文件一種特殊指針Void* 可指向任意類型數據(const 修飾除外)
備注在定義指針時,盡量完成對指針的賦值,如果當前指針所指對象還沒有定義,則將其賦值為0。因為C++不檢測指針的賦值,未賦值的指針會被隨意分配內存,導致程序崩潰。
指針的操作
解引用操作:
"*"的作用是引用指針指向的變量值,引用其實就是引用該變量的地址,“解”就是把該地址對應的東西解開,解出來,就像打開一個包裹一樣,那就是該變量的值了,所以稱為“解引用”。 也就是說,解引用是返回內存地址中保存的值。
string s("hello") string *p =&s count <<*P //輸出“hello”備注:沒有采用解引用操作時就是對指針的操作,與指針所引用的變量無關
string s1("world") p = &s1 cout << *p //輸出“world” cout << s //輸出“hello” *p =s;cout << s1;//輸出“hello” #include <iostream> using namespace std; int main() {cout << "Hello, world!" << endl;string s("hello");string *p = &s;cout << *p << endl;string s1("world");p = &s1;cout << *p << endl;cout << s <<endl ;*p = s;cout << s1 <<endl;} //運行結果 Hello, world! hello world hello hello指針訪問數組元素
在表達式中使用數組名字時,該名字會自動轉化為指向數組的第一個元素的指針。
int ia[]={0,2,4,6,8} int *Arr = ia;//*Arr = ia[0] 指針的算術操作 int *Arr2 = Arr+2 //*Arr2 = ia[2] int Varb = *(Arr+2) // Varb = ia[2] ptrdiff_t n = Arr2-Arr // n = 2 ptrdiff_t是一種標準庫類型的數據 指針的下標 int k = Arr2[-2]//k = ia[0],下標不可超出數組首,超出數組末端(最后一個元素的下一個地址)的指針下標,成為哨兵,可參與比較不可解引用 #include <iostream> using namespace std; int main() { int ia[]={0,2,4,6,8}; int *Arr = ia; cout << *Arr <<endl; int *Arr2 = Arr+2; cout << *Arr2 <<endl; int Varb = *(Arr+2); cout << Varb <<endl; ptrdiff_t n = Arr2-Arr; cout << n <<endl; int k = Arr2[-2]; cout << k <<endl; //超出數組末端成為哨兵的指針作用 for (int *pbegin = ia,*pend = ia+5;pbegin != pend;++pbegin)cout << *pbegin << ' '; }運行結果 0 4 4 2 0 0 2 4 6 8指針和const
Const修飾符可前可后,為防止混亂,一律放在前面修飾比較好
指向const 對象的指針
C++要求指向Const對象的指針也具有const特性,什么叫Const特性?const的特點就是值不可修改,那么具有const 特性的指針就是不能通過其解引用修改值,此即const特性。
具有cont 特性的指針可以指向const 常量也可指向普通變量,但是都不可通過解引用修改值。
const double *cptr; //定義const特性的指針 const double pi = 3.14;//const 常量必須賦初值 *cptr = &pi //cptr指針指向pi常量 double pi2 = 3.14159 *cptr = pi2//錯誤,不可通過解引用改變值cptr = &pi2//可以,指向一個非常量const指針
const 指針和指向const對象的指針肯定是不同的。const 指針本身的值不可修改。
/指向常量的指針 int errNumb = 0; int *const p = &errNumb;//此處的*const 因該放在 int 后 errNumb = 1; //可直接修改errNumb的值 *P = 2 ; //可修改解引用的值 p = &errNumb +1 //錯誤,不可修改指針本身的值/指向const 常量的 *const,不可做任何修改 const int a =1; int *const pa = a ;一種間接的const 類型指針定義 typedef string *pstring; const pstring cstr;//cstr是一個const 指針 #include <iostream> using namespace std; int main() { int k = 1 ; int *const p = &k ; k = 2 ; cout << *p <<endl; *p = 3 ; cout << k <<endl; }運行結果 2 3#include
using namespace std;
int main()
{
int k = 1 ;
int *const p = &k ;
k = 2 ;
cout << *p <<endl;
*p = 3 ;
cout << k <<endl;
}
運行結果
2
3
總結
- 上一篇: 入门无人驾驶学习路线
- 下一篇: C++语法细节注意集锦