c語言陣列與指標問題,c語言陣列與指標的問題關係請教

2022-03-21 01:36:36 字數 5575 閱讀 1470

1樓:

1,書上說的不準確,陣列應該看做一種獨立的型別,sizeof只與型別有關。詳細的可以參考這個:http:

如果你弄明白了這個剩下就簡單了。

2,我先說一下結論吧。按照你的要求應該這樣定義p: int* p[3];。

因為你想要的是訪問每一行的數字,所以需要p為整型指標的陣列,這樣每個元素是整型指標,可以像p[1][2]這樣的方式訪問每一行的內容。初始化即p[0]=a[0];p[1]=a[1];p[2]=a[2];(利用陣列型別的隱式轉換,a[2]本身是個陣列,被轉換成指向元素int的指標)

下面的內容如果你不打算設計一種語言或者寫一個編譯器的話,可以忽略。

現在來看你給的定義。按照1,把陣列看做型別,按照內到外的型別分析法,p是個指標,指向一個3元素陣列,元素為3元素的int陣列。而陣列a可以轉換成元素指標,俗話說就是p要比a轉換成的指標高一個層次。

而且c語言沒有陣列賦值和取地址。。。。所以,你的p如果沒有強制型別轉化是沒法向你想的那樣初始化的。你可以這樣驗證一下:

printf("%d\n", sizeof(p));

printf("%d\n", sizeof(p[0]));

printf("%d\n", sizeof(p[0][0]));

printf("%d\n", sizeof(p[0][0][0]));

大概就可以知道他們是什麼了。

如果直接先不說型別不一致(就算可以強制轉換),還會造成非法記憶體訪問的,因為你沒有初始p指標就給記憶體賦值了。

那麼,按照你的要求,p應該是一個3元素陣列,每個元素指向一個3元素整型陣列。所以p應定義為int (*p[3])[3]; 這樣就符合要求了,可以使用上面的方法驗證一下。

但是遺憾的是,這樣做不能具有一致的元素訪問方式,你想要訪問內容必須使用p[0][0][0]的形式。這種型別與訪問不一致主要是由於陣列的隱式型別轉換導致的。這個問題就牽涉到語言本身的語法定義問題了,深究的話。。。。

可以出書了。

所以你還是使用我最前面給出的方式定義p吧,雖然看起來p只是指向int的指標陣列,不符合指向「a的第一二三行」的語義(就是說不能用sizeof來獲得每行的長度)。

2樓:

1:sizeof(a)出來的就是整個陣列的大小,如果要4個位元組只能sizeof(a[0])

2:可以

c語言陣列與指標的問題關係請教

3樓:

char (*b)[4]是陣列指標,指向一個含有4個元素的陣列char **c 是指向字元指標的指標,等價於:char *c;

這裡就要注意優先順序了, 的優先順序高於*,而()可用來強行優先.

char(*b)[4] 由*b知道這是一個指標,再有知道該指標指向的是陣列.

char *c 由 知道這是一個陣列,再有char *知道這個陣列的內容是指標

兩個定義方式明顯不一樣!

而你這樣賦值 c=b ,那麼明顯是有問題的,你僅僅是將c的每個指標附上了值,並沒有對其所指內容賦值,c[0]已經沒有任何意義(僅僅是一個指定指向地址的指標變數),因為c[0]分配的地址是由『1』轉換來的(c語言完成),當你用取地址符「&」取c[0]的地址後強轉(%d)出來必定和b[0]一致。而b[0]和c[0]從層次關係上來說,必定是不一樣的

不知道這樣說,你清楚沒?

4樓:匿名使用者

char (*b)[4]=;

這個有語法錯誤吧

c語言指標與陣列問題!

5樓:匿名使用者

這個問題關鍵在於理解指標為什麼要有型別。其實不同型別的指標本質上都是一樣的,即記憶體地址,地址本身是沒有型別的,賦予指標型別的意義在於給出儲存資料的位元組寬度,也稱資料對齊寬度。比如 int *pt,pt是一個整數指標,那麼編譯器便知道如果通過pt讀取資料時需要一次讀取4位元組,因為那裡存放著一個int。

換句話說指標型別定義了資料訪問時的位元組長度。

int a[3][4]定義了一個固定長度的二維陣列,其行寬為4列int,即4*4位元組為一行,可見對齊寬度為16位元組,也就是每16位元組劃分為一行;行數為3行。其中a代表了陣列首地址,其型別為int (*)[4],地址型別中的長度引數([4])取自於陣列定義,由編譯器確定。陣列定義中包含了維度資訊和記憶體地址及其型別,當通過陣列名訪問元素時必須同時指定行列索引。

為了靈活高效地定址,可以採用指標訪問陣列,那麼指標型別必須和陣列首地址匹配(一致),因此如此定義 int (*p)[4]。可以看出該定義與陣列a的地址型別只是多了個p而已,也就是明確了指標名稱。那麼為什麼編譯器會將 int a[3][4]的地址定義為 int (*)[4]呢?

二維陣列的指標,其運算的基本單位是行寬,因此二維陣列的指標又稱為行指標,假設a的首地址為1000,p指向a,當p++時地址值是增加了一行的寬度,也即加一後p的值為1016而不是1001也不是1004。因此int (*)[4]的含義為其資料寬度為4個int的指標,從而int (*p)[4]的含義為:p是一個指向行寬為4個int的指標,也即每個元素為4位元組的int,而行總位元組數為4*4=16。

解讀此類定義時先從括號內開始,解讀順序為:括號內是個指標p,其括號右側是陣列長度,表明指標p指向的是一個含有4個元素的行,字首(左側)int定義了基本資料型別,即元素型別為int,那麼行寬就是4個int組成,就是4*4位元組。

說了一大堆,那麼如果你看明白了,p=a就不用解釋了吧(賦值a的地址)。

6樓:匿名使用者

int (*p)[4]是一個定義陣列指標;

p = a;是讓這個指標指向a陣列;

記住,要想用指標訪問陣列:

一維陣列 -> 一級指標

二維陣列 -> 陣列指標

指標陣列-> 二級指標

7樓:連睿子車雨靈

p[2]是合法的,因為a本身為一維陣列,而p也是一維指標,所以這樣沒問題。p[2]相當於*(p+2),也就是a[2]。

但是q[2][3]是絕對錯誤的,因為b是一個二維陣列,而q是一維指標,所以不能這樣呼叫。另外,q=b也是錯誤的,理由同上,q=&b[0][0]就對了,你可以自己思考一下為什麼。

8樓:

定義一個指向陣列的指標 並初始化指標的值

c語言陣列和指標的問題

9樓:舒淼閔語蝶

首先,o和j沒有初始化,這個需要初始化;其次,你的main()函式引用的function()函式,引數為整形陣列,但是你定義的function函式是整形指標,不知道這個會否有影響,檢查一下。

10樓:匿名使用者

b選項左邊p[0]表示整型陣列中的第一個元素,而右邊a是一個指向整型的指標的陣列的陣列名,所以不會相等,答案應該為c。

11樓:匿名使用者

a錯,因為p不是pointer

b錯,因為p[0]不是pointer

c對,意即a[1]=p;(p是陣列p的位址,也是p[0]的位址)d錯,a[0]是一個pointer,不能存整數

12樓:

答案是c,b是錯誤的,型別不匹配,p[0]是個整型變數,不能接受指標陣列首地址的賦值,整型變數和二級指標完全不相容!除非強制轉換,*(a 1)就是a[1],和p型別相容都是整型指標,所以選c,b沒有什麼好解釋的,是一個嚴重錯誤!

13樓:羅帥

答案(c).a選項中型別不同,b中也是型別不同,d中不能直接將整數賦值給指標

14樓:匿名使用者

陣列p 中把a賦值給陣列p 且放於第0項

c語言的問題,指標陣列

15樓:匿名使用者

改變不了,字串常量是改不了的,你可以試試char *p = "aaaaa";

p[1] = b;這樣是改不了的

只能定義二維陣列才可以改

char p[3][100] = ; 這樣才可以改,不要問為什麼,字串常量就是不能改

16樓:千鋒教育

直接讓指標指向另一個字串即可

p[0]="aaaa";

17樓:橙

這樣定義指標指向的字串是無法修改的。

c語言指標與陣列問題,運算子到底是個什麼鬼? 50

18樓:匿名使用者

*p是取p指標所指向的記憶體內容

*p++是分兩個部分的:先取指標內容,再移動指標

而結合具體的**,移動指標是在本**之後進行的:

對於第一題來說,當執行時*p++本身的值為a[1]的內容,然後執行p++後指向a[2],所以再取*p的值時,值為30

a[1]=20;a[2]=30;

p=&a[1]//指向a1

c=*p++;//執行*p++時,它的值c應該是20,此語句執行完成後,p批向a2

d=*p;//已經指向a2,所以d的值為30

而第二題來說,可以分成這兩步:printf("%d",*p); p++

所以它在執行時,1肯定也是被執行的。因為第一次執行printf語句時,p是指向a的

19樓:

我覺得這樣的問題就是為難初學者,看多了就明白了先搜一下運算子的優先順序  * 小於++ ,所以p++ 指向了a[2]自增自減 運算子 有一個規律   先執行後運算先直線printf("%d",*p) 然後運輸p++;

你可以搞一個簡單的 例如 j=0;

printf("%d",j++);也就明白了先執行後運算這句話了.

20樓:風火輪

如果單獨一句 *p++; 那麼確實*p的值變成30。

但是for迴圈裡的printf()中的*p++,它的預設操作是先取*p的值,執行完printf("%d",*p); 再執行p++;

c語言指標和陣列的問題,急!

21樓:匿名使用者

&a 、 a、 &a[0]都是一個值,指向首地址。

&p1是取指標p1的地址,不是p1內容的地址。p1 p2相等,但是&p1 不等於p2。

p3 與 陣列a沒關係,但是因為a[4]正好索引到陣列a最後一個成員的下一個地址,因此正好是p1的地址。這段解釋比較麻煩,畫個圖會明白些。

簡單的說,區域性動態變數的空間是在棧內分配,而不是一個全域性性的不變的量。進入函式以後,按順序,從棧的空間中,給函式中定義的各變數分配空間。在你的函式中,最前面4個int型分配給陣列a,接下來分配給三個指標p1/p2/p3。

因為陣列a是int型,每個成員佔用4個位元組。而指標佔用也是32位,正好與int型相同。注意,32位系統中,指標都是32位長。

因此p1 p2 p3的地址,相當於陣列a順序往下數第5、6、7個成員。也就是說

&a[4] == &p1

&a[5] == &p2

&a[6] == &p3

請教指標與陣列的問題,C語言的問題,指標陣列

是可以的。c在這裡是很靈活的。int a 10 相當於int const a int malloc sizeof int 10 陣列名a相當於一個常量指標,指向int型別。同樣也可以把指標當成變數型的陣列名,如你文中所說。無論是常量型的a i 還是變數型的pbuf i 編譯之後其實都是執行的 a i...

c語言中陣列指標a有啥區別,C語言中陣列指標 a 與a 有啥區別?

第一個a中有2個符號,所以要看優先順序,看限於誰結合。已知比 優先所以版第一個a先與 權結合,所以a是一個陣列,陣列中的元素都是指標a就單單表示陣列。例子 char a a是陣列,元素都是char 即指標 char a a是陣列,元素都是char 即字元 a 這個為指標陣列,int a 5 就定義了...

C 的指標和陣列問題,C 的指標和陣列問題

這種二維指標是不能操作這種二維陣列的,二維指標就是指標的指標,而這種情況應該用陣列指標,另外,由於二維自動陣列也是順序存放的,所以可以用一維指標傳遞二維陣列的地址。首先,你對指標沒有弄明白,最後詳細系統的瞭解一下指標的知識,這你可以參考c 語言程式設計教材的指標部分。第二,來說說本題,如果你把int...