我的隨行筆記3 C++ Primer Plus 3--指標

qwer1030274531發表於2020-08-27

 指標前面的*運算子稱為間接值或解除引用運算子。


1.C++中指標宣告:int*  ptr; //強調int*是一種型別——指向int的指標。 ptr本身是一個指標


                                int*  p1,p2;  //宣告一個指標p1和一個int變數p2.


2.**指標的初始化:(不是初始化它指向的值)    int h=5;  int* pt= &h;【指標的初始化非常重要】(delete pt; //不允許)


    如下語句:long *fellow;  *fellow=23323; //會產生bug,無法確定fellow指向哪裡,指向的可能不是儲存23323的地方


3. 指標不是整型 : int*  pt; pt=0xB8000000; //不合法 


                               int*  pt; pt=(int *) 0xB8000000;  //合法


4.在C中用庫函式malloc()來分配記憶體,在C++也可以這樣,還有種方法——new運算子。new和delete要配對使用


  int * pn=new int;  ....delete pn; //用delete來釋放new分配的記憶體


double * pd=new double; *pd=10000001.0;  //size of pd  =4 , size of *pd=8, 指標的長度是4個位元組,與所指的資料型別無關


5.使用new建立動態陣列:


double * p3=new double [3];  //建立包含3個doble元素的陣列,指標p3指向記憶體中的第一個元素


p3[0]=0.2;  p3[1]=0.5;  p3[2]=0.8;  //指標訪問陣列中元素


p3=p3+1; cout<<p3[0]<<" "<<p3[1];  //輸出結果是p3[0]是0.5,p3[1]是0.8。p3+1導致指標指向第2個元素。


p3=p3-1; delete [] p3;   //在釋放指標時,應減1,指向原來的值。 釋放陣列記憶體時要加[]


6.指標變數加1後,增加的量等於它指向的型別的位元組數。


多數情況, C++將陣列名解釋為陣列第1個元素的地址。


使用陣列表示法時,C++執行下面的轉換: array[i] --> *(array+i)


使用的是指標,而不是陣列名是,C++也執行轉換:pt[i]--> *(pt+i) 


7.對陣列應用sizeof得到的是陣列長度; 對指標應用sizeof得到的是指標長度(=4);


8. 陣列的地址


short tell[10];  

 

cout<<tell<<endl;  //顯示&tell[0]的結果,是一個2位元組的記憶體塊地址

 

cout<<&tell<<endl; //對陣列名取地址(&)顯示整個陣列的地址,是一個20位元組的記憶體塊地址

 

//tell是一個short指標 *short

//&tell是一個指向包含20個元素的short陣列的指標 short(*)[20]

 

short (*pas)[20]=&tell; //pas指標指向含20個short元素的陣列

//*pas等價於tell, (*pas)[0]=tell[0];

9.如果給cout提供一個指標,它將列印地址,如果指標型別為char* ,則cout將顯示指向的字元。


   如果要顯示字串地址,則必須強制轉換(int *) ps。


 char animal[20]="fox";        char *ps;


ps=animal;   cout<<ps<<" at "<<(int *) ps<<endl; //ps是一個指標,但顯示字串,(int *) ps顯示字串地址


10.透過使用new和strcpy()來獲取字串陣列的副本


  ps=new char[strlen(animal)+1];   


  strcpy(ps,animal); //不可直接賦值,ps=animal,只想將地址複製給ps,兩個指標指向相同的記憶體單元和字串,沒有複製字串。


11.使用new建立動態結構時,指標pa表示指向結構的指標,訪問結構成員的方式:(1)pa->name;(2)  (* pa).name [name為結構成員]


12. 


struct Years

{

 int year;

 int month;

};

Years y1,y2,y3; //建立結構變數

Years ys[3];    //建立結構陣列

 

 

const Years * apy[3]={&y1,&y2,&y3};  //建立指標陣列

 

//建立上述指標陣列的指標,兩種方式

 const Years ** ppya=apy;   //方法1

 auto ppyb=apy;             //方法2,方便一點,不易搞混

//訪問

std::cout<<(*ppya)->year<<std::endl;

std::cout<<(*(ppyb+1))->yrar<<std::endl;

13.模板類 vector類(動態陣列) :應用是加標頭檔案#include <vector>;


using spacename std;    vector<int>   vi(n); //名為vi的vector物件,可儲存n個int型別的元素,n可為整型常量,也可為整型變數


14.模板類array類  (C++11)應用是加標頭檔案#include <array>; 與陣列一樣,array物件長度固定。


using spacename std;    array<int,5>   ai; //名為ai的array物件,可儲存n個int型別的元素,n為整型常量.,這裡n=5;


15. 陣列、array物件、vector物件都可以用標準陣列表示法來訪問每個元素。


array物件可以直接賦值給另一個array物件,而對於陣列,必須逐元素複製資料。


array物件和陣列儲存在相同的記憶體區域(即棧)中; vector物件儲存在另一個區域(自由儲存區或堆)中。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2715092/,如需轉載,請註明出處,否則將追究法律責任。

相關文章