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