C 中,intp 和int a怎麼會是型別呢

時間 2021-05-05 18:49:36

1樓:匿名使用者

int b[2]是一維陣列,其位址型別是 int *

int a[1][2]是二維陣列,其位址型別是 int (*)[2]

凡是陣列指標都涉及乙個概念,那就是元素對齊和列對齊。

什麼是元素對齊?

int b[2]定義了乙個一維陣列,該陣列每個元素型別是int,而乙個int資料占用記憶體4位元組(32位系統),也就是說元素是有寬度的,單位是位元組。為使指標運算時可以準確定位每個元素,編譯器必須知道每個元素的位元組寬度。

比如 int *p=b;

p獲得了b的位址,p++後,由於知道元素型別是int,因此每遞增乙個位址,實際上遞增了4位元組,從而實現準確定位,這就是元素對齊,而4就是int型別元素的對齊寬度。

編譯器會自動為你定義的陣列指定乙個位址型別(隱式轉換)。所以你定義的陣列int b[2]的位址型別被轉換為int *。而元素個數被忽略,因為指標的目的就是指向準確的元素,編譯器不會檢查是否越界。

列對齊int a[1][2]告訴編譯器,這是個二維陣列,且每行具有2個int類元素,每行遞增位元組寬度就是4*2,即int型別的寬度與列數的乘積,等於每行總位元組數,以便於指標在遞增時可以準確定位到下一行,這就是列對齊。

因此編譯器在轉換時保留了列數和元素型別 int,[2],而行數[1]被忽略,就像一維陣列一樣忽略了行數,因為二維陣列指標運算主要就是準確定位行首位址,不會檢查行越界。因此最終被轉換成 int (*)[2],(*)[2]意思為對齊寬度為2個元素的指標,而元素型別是int,所以int (*)[2]意思為這是乙個對齊寬度為2個int型別元素的指標。

所以 p=a可以,int *p=a不可以,因為型別不匹配,而int *p=b可以,因為陣列b的位址型別為int *,型別匹配 。

2樓:匿名使用者

簡單來說,如果把二維陣列看成乙個一維陣列,則其每乙個元素就是乙個塊資料,如int a[5][3] ;若看 b[5],則b[0]就是乙個有三個int元素的塊資料。

int (*p)[3]; 就是定義乙個指向 有三個int元素的塊資料 的變數

所以,p=a可以賦值!

c++中int *p[3]和int (*p)[3]有什麼區別

3樓:無聊的

int *p[3]是定義了乙個名為p的陣列,裡面有三個型別為int*的元素。

也就是p[0],p[1],p[2]分別儲存了乙個int*;

而int (*p)[3]是定義了乙個指向有三個元素的int型別陣列的指標,比如說

int a[3];

int (*p)[3]=&a;

那麼(*p)[0]就是a[0]

設有變數定義 int a[3][2]={1,2,3,4,5,6}, (*p)[2]=a;表示式**(p+2)=*p[2]的值?

4樓:潘良段幹宛菡

(*p)[2]=a表示來

將p定義為乙個指向自

含2個元素的一維陣列的指標變數,那麼二維陣列就可以看作是一維陣列a[3],其中每乙個元素都是乙個一維陣列,a[1]=,a[2]=,a[3]=;

則p+2就指向了a[3],*(p+2)是a[3]的首位址,**(p+2)就是a[3]的首元素,即為5。

5樓:匿名使用者

**(p+2),*p[2]這兩個表示式是等價的,當然,**(p+2)=*p[2]是乙個賦值表示式,最終的值還是a[2][0],即5

6樓:匿名使用者

作用是:a[2][0]被 a[0][2]也就是a[1][0]賦值

7樓:匿名使用者

**(p+2)的值為5

為什麼int a[]={1,2,3,4,5}是對的,而int*p={1,2,3,4,5}是錯的?求解釋

8樓:匿名使用者

int a=實際上是bai用初始

化空間du後,分配給a ;int*p這個定zhi義根據daoansi c++的規定p為指標,必須內顯式為其分配空間,否則容p指向的未知不定。

二者的差異是ansi/iso c++規範決定的。

9樓:

前面定義的來整型陣列,沒錯;

第二個自定義的是乙個整型指標變數,但是你給它初始化了5個值,而它只能指向乙個整型的變數,所以編譯錯誤;

你可以這樣定義:

int a=;

int * p =a;

10樓:滬上新視界眼科

個人看法:誤解bai了指標和

du陣列的關係!數

zhi組int a和指標 int *p中,daoa和p是可以賦值的回!即p=a成立。但是,答不準確的說,int a代表的是乙個起始位址,這個位址儲存在a中;int *p代表的是乙個整形變數!

不能用{}賦值。

11樓:匿名使用者

int a;

int *p = &a; //宣告乙個指標後面是要跟乙個位址的。

指標有指標的初始化方法,陣列有回

陣列的,要牢記,不能混淆答

你可以參考這個

12樓:匿名使用者

第乙個int a說明a是乙個陣列,裡面存放的是整形變數,而第二個int *p說明p是乙個指向整形變數的指標,只有乙個整形空間,準確的說這二個定義時所擁有的記憶體空間就不相同。

13樓:匿名使用者

對陣列來說,這樣的初始化是對的,但對指標來說,它初始化的是位址,舉個例子 char * p=「string」,它不是指的是* p=「string」,而是p等於這個字串的首位址 。

14樓:匿名使用者

*p為指標,p中儲存的是位址,你為位址初始化陣列元素顯然是不正確的

15樓:匿名使用者

前面是 int型別的陣列 當然無錯

後面你是想表達 指標型別? 那你後面大**裡面又是int··

c/c++中,int ** a;是什麼意思啊?

16樓:會飛的小兔子

*表示指標;

int*a裡表示a是乙個指向int的指標,指向是用來儲存指標位址的;

int**a表示專*a是指標指屬向整數指標型別int*a表示a是指向整數的指標型別;

int*a是宣告指標;

int(*a)把指標a取值,並且轉換成int;

(int*)a把a這個變數轉換成int*;

擴充套件資料int*a的使用

intmain()

17樓:水上漂湯

在定義乙個

變數的時候,*表示指標

比如int * a,表示a是一內個指容向int的指標int **a相當於(int *) * a,表示a是乙個指向int *的指標(通俗點說就是a的值是乙個指標,或者說位址),即指向int指標的指標,這是2級指標。

int m = 1;

int *p = &m;

int ** a = &p;

18樓:背心_心背

定義乙個int型別的二維指標a

19樓:匿名使用者

指向int型指標的指標

20樓:

就是乙個指向指標的指標,用來儲存指標的位址

C 中,給指標賦值時,int P和

臺藻趙玥 都是定義了乙個指標變數,然後把a的位址複製給這個指標變數,效果基本是一樣的。稍微的區別是,乙個是直接賦值,乙個是先定義,後賦值。區別在於,第二種先定義,後賦值的情況,如果定義與賦值間還有其他 那麼p指向的位址是未知的,所以使用的話會有未知行為。如果定義與賦值是連續的語句,那麼上述兩個內容就...

C語言指標,int p和int p,其中p是不是相同的變數?為啥號的位置不同呢

夢幻陽光 樓主對變數的概念還不是很瞭解 定義一個變數的時候,不管前面有多少東西,都是型別,只有最後面的是變數名 如 int a a為變數,改變數為int型 int b,int b 這兩個是一樣的,b為變數名,int 為修飾的型別,此處為int行的陣列 int c c為變數名,int 為修飾的型別,此...

C 中如下定義是否合法,int a 41,2,3,45,6,78,

不合法二級 最多只能3對,你定義的是3行4列的陣列,初始化列表卻是4行的,不行的 不合法,a只定義3行,但是初始化裡有四對大括號,這是唯一錯誤。注意,每個大括號裡最多四個元素,這是對的,允許有少於四個,錯誤不在這裡。 可以,我回答你主提問的那問,因為你寫出的式子不一致。和int a 3 4 1,2,...