c++的指標型別,問題源於如下一件事情的爭論。
1.如下位址設定
int array[4] =
int * p = (int )(array+1)//位址+1
int p2 = (int*)(&array+1)//位址的位址+1
cout<<(p-1) = 0
cout<<(p2-1) = 3
與同事一起討論,為什麼p2的位址-1後取得的資料是3
其實這問題不難理解,首先原則,指標運算的最終結果取決於步長。
即:int* a = 5; a+1 = 5+4=9(為什麼步長是4,因為int的型別是4所以int型別指標的步長是4)
回到上面的問題
1.假設array的位址是5,那麼array+1是多少呢?
因為array==首位址的指標,array是int型別,array的首資料也是int行,那麼首位址的指標就是int指標,步長是4。
array +1 = 9,即: p=9;
2.那麼&array+1的位址是多少呢
那麼array是什麼型別呢,是陣列型別,當把array當成物件理解時,那麼這個物件時多大的呢,時44 = 16;
&array+1 = 5+16 = 21;
這樣理解(cout<<(p2-1) = 3)就容易了。
p2的位址是21但是當轉換成int*時,步長就變成4了,所以p2-1 = 21-4 = 17,(array下標為3的位置);
上面的理解能解釋通這個問題,但是同事們還在糾結:陣列的名稱本身就是位址,取位址的位址有什麼意思呢。
想解釋清楚這個問題,必須定義乙個陣列型別的指標。陣列型別的指標怎麼定義呢。
最初我因為是這樣的
int*[4] arrayaddr;
後來確認這種方式是不對的,這裡吐槽一下,這裡確實覺得c++的語法確實不太友好,個人覺得不符合我們通常思考的習慣。
其實是這樣 int (*arrayaddr0)[4]
好了步入正題,扯的有點遠了,我就是想把c++的指標做乙個總結:
c++用到指標的地方主要有以下3類:
1.物件,基本型別
2.陣列
3.函式指標
4.函式指標陣列
物件好理解,不舉例了,下面對陣列和函式指標做如下舉例
陣列:int (*pa) [2]; //型別原型: int a[2]
int (*pa) [2][2]; //型別原型:int[2][2]
函式指標
int (*pfunname)(int ,int ); //型別原型:int funname(int a,int b);
void (pfunname)(); //型別原型:void funname();
函式指標陣列
int (*pfunarray[5])(int ,int);
我到今天才對指標有這麼乙個總結的認識(儘管以前都用過,但是沒有發現期間有這麼簡單的乙個規律),以後關於指標的型別,我再沒有語法猜測的困惑了。
陣列指標和指標陣列的區別
該篇文章的後續總結(姊妹篇吧)
指標 c++的一切 就是程式設計師的玄鐵重劍
簡單總結C語言中各種型別的指標的概念
c語言中有很多關於指標的使用,指標也是c語言的靈魂所在,而且c語言中也有很多有關指標的概念,這裡學習並總結了一些知道的概念。常量指標 首先它是乙個指標,常量只是用來修飾指標的定語。其定義如下 char const cp char a a 如何識別呢?根據右結合優先,先是 優先,所以這個cp變數是乙個...
C 指標型別
1.定義 型別 指標變數 型別決定了指向的記憶體空間的大小。指標變數也是一種變數,有著自己的記憶體空間,該空間上儲存的是另乙個變數的記憶體空間。可以使用typedef取別名來減少定義變數時的一些麻煩,如typedef int pointer 2.操作 1 取位址 int p int x p x p指...
指標簡單型別分析(1)
的優先順序高於 指標是位址而指標變數是存放位址的變數 int p 普通整型變數 int p 首先從p處開始,先與 結合 說明p是指標 然後再與int結合 說明指標所指向的內容型別為int型 所以p是乙個返回整型資料的指標 int p 3 首先從p處開始,先於 結合,說明p是乙個陣列,然後與int 結...