c 的指標型別簡單總結

2021-09-12 08:09:01 字數 1529 閱讀 5978

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 結...