C++基礎知識學習-聲明/定義/引用/指針

聲明(declaration),定義(definition)

如果想聲明一個變量而非定義它,就在變量名前添加關鍵字extern,而且不要顯式地初始化變量.

extern int i;//聲明i而非定義i
int j;//聲明并定義j
extern double pi=3.1415;//定義

聲明可以被多次聲明

復合類型(compound type)--引用(reference)和指針(pointer)

引用(reference)

通過將聲名符寫成&d的形式來定義引用類型

int ival=1024;
int &refval=ival;
int &refVal2;//報錯,引用必須被初始化

引用并非對象,相反的,它只是為一個已經存在的對象所起的另外一個名字(引用即別名)
為引用賦值,實際上是把值賦給了與引用綁定在一起的對象.
引用只能綁定到對象中,不能把字面值或者某個表達式的值綁定到引用上.

int &val=1024;//報錯,不能把字面值賦給引用.
double i=3.1415;
int &val=i;//報錯:不能把double對象賦給int引用.
指針(pointer)
  1. 指針本身就是一個對象,允許對指針賦值和拷貝,而且在指針的生命周期內它可以先后指向幾個不同的對象.
  1. 指針無需在定義時賦初值.
  2. 定義指針的方法是將聲名符寫成*d的形式,其中d是變量名.
int *i,*i1;
double dp,*dp2//
  1. 獲取對象的地址:取地址符(&)
double val=3.14;
int *p=&val;//取val的地址賦值給指針p;
  1. 因為引用不是對象,所以不能定義指向引用的指針.
int i=1024;
int *p1=&i;//將i取地址賦給指針p1
int *p2=p1;//將p1指針賦給指針p2
//p2和p1指向的對象是同一個對象
  1. 利用指針訪問對象
    如果指針指向了一個對象,則允許使用解引用符(*)來訪問對象.
int i=1024;
int *p=&i;//將i取地址賦給指針p
*p=2048;//指針p所指向的i也變成2048
  1. 空指針(null pointer)
    c++11中增加了使用nullptr字面值來定義空指針
int *p=nullptr;//c++11中增加
int *p1=0;//將p2初始化字面量0;
int *p2=NULL;//需要首先#include <cstdlib>;
  1. void*指針
    void*指針是一種特殊的指針,可用于存放任意對象的地址.要注意的是,不能直接在void*指針中操作void*指針所指向的對象,因為我們不知道void*指針所指向的是何種對象,但是可以通過static_cast進行類型轉換.
int i=1024;
void *p=&i;//將i取地址賦給void指針
cout<<*p<<endl;//錯誤,對void*指針不能操作輸出
int *p1=static_cast<int*>(p);//將指針p進行類型轉換賦給p1
  1. 對指針的引用
int i=1024;
int *p;
int *&r=p;//從右向左讀,r首先是個引用(&),
//然后其他聲明符的其他部分確定r引用的類型是什么,*標識引用的是一個指針

** 涉及到指針或者引用的聲明,一般有兩種寫法:(注意:沒有誰對誰錯)**

  • 把類型修飾符(&或者*)和變量標識符寫在一起.
int *p=nullptr;//這種形式著重強調變量所具有的復合類型.
  • 把類型修飾符(&或者*)和類型名寫在一起.
int* p=nullptr;//這種形式強調聲明定義了一種復合類型.

面對一條比較復雜的指針或者引用的聲明語句時,從右向左閱讀有助于弄清楚它的真實含義

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容