二級C語言關於指標與二維陣列謝謝

時間 2022-03-08 15:00:04

1樓:

a) p是一個指向char型別的指標,如果指向陣列,則陣列也應該是一維陣列才可,這裡s是二維陣列,不可

b)k是一個陣列指標,它指向一個陣列,但是這個陣列要求有三個char型別的資料,跟p不匹配,不可

c)s[0]表示s這個二維陣列的第一行,也就是,它屬於一維陣列,跟p匹配,可

d)將一個二維陣列賦值給一個指向一維陣列的指標,不匹配,不可

2樓:

選c是正確的。原因就是p與s[0]的型別都是int *,其他不能選的原因是等號兩邊的型別不一致。

3樓:小0壞

s 陣列 二維和一維沒多大區別 k是指標陣列 只指向某一段空間 p是指標 但是隻只想一個

a中 p不是指標陣列 錯 b中指標 不能付給指標 沒意義 錯 c中 指標k的空間不夠

4樓:匿名使用者

我覺得把。

a中。p可以用p=s的這樣的定義表示p指向一個一維陣列。,二維好像不行。。好像是因為那個地址不是那樣算的。嗯。。p=s[0][ x],p+1=s[1][ x]。

b中 k應該是個指標陣列把。。應該是*p=k,這樣的把。。?

d中 k是指標陣列的地址。s是二位陣列的地址。這樣好像毫無意義。。。

額。不好意思。。不對的地方請指教。。

我也在學習的。。。

5樓:商法典

只有s後面有中括號,代表整體陣列。

6樓:匿名使用者

a,語法精緻,b,p是一緯指標,而k顯然不是一緯陣列。d,必須要求第二維大小相等,你一個是3,一個是10,當然不允許

7樓:百小度

選as就是s[3][10]這個陣列的首地址

c語言二維陣列用指標表示的問題

8樓:匿名使用者

#include

void main()

;int (*p)[4];

p=a;

printf("%d",*(p)[3]);

}首先你沒有理解int (*p)[4];

他的意思就是含有4個指標的陣列 由於int a[3][4]只有3行,所以*(p)[3]這個地方就越界了

如果*(p)[2]地址中的值就是17 *(p)[1] 就是9 ,*(p)[0]就是1

如果你要列印7 *((p)[0]+3)

9樓:匿名使用者

因為p[3]沒有指向a[0][3],你加條語言

printf("%x\t%x\n", p[3], &(a[0][3]));

就知道了。

10樓:匿名使用者

printf("%d",(*p)[3]);

11樓:貴藹堂馨蓉

你說要放到另外一個陣列b中,但是沒看到你定義新的陣列,所以我就按我自己的理解做了。

#include

#define

rows

3#define

cols

4double

copy_ptr(double

*tar);//一個變數就夠了

//rows和cols本來就是define的,全域性intmain(void),,

,};double

*p=source[0];

printf("taget[%d][%d]=",rows,cols);

copy_ptr(p);

printf("\n");

while(1)

{}return0;}

double

copy_ptr(double

*tar)

}//直接輸出了……

return0;}

有問題歡迎**……

12樓:匿名使用者

#include

int main()

;int (*p)[4];

p=a;

printf("%d",*(*p+2));

return 0;

}//你沒有理

解多維陣列a的意思

c語言怎麼用指標代替二維陣列

13樓:匿名使用者

1.設p是指向二維陣列a[m][n]的指標變數,則有:

int* p=a[0];//此時p是指向一維陣列的指標。p++後,p指向 a[0][1]。

2.如果定義int (*p1)[n];p1=a;p1++後,p1指向a[1][0];

則p+j將指向a[0]陣列中的元素a[0][j]。

由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下:

p+i*n+j, 相應的如果用p1來表示,則為*(p1+i)+j。

元素a[i][j]相應的指標表示為:

*( p+i*n+j) ,相應的如果用p1來表示,則為*(*(p1+i)+j)。

同樣,a[i][j]也可使用指標下標法表示,如p[i*n+j]。

若有:int *p=a[0];

則陣列a的元素a[1][2]對應的指標為:p+1*4+2

元素a[1][2]也就可以表示為:*( p+1*4+2)

用下標表示法,a[1][2]表示為:p[1*4+2]

14樓:memo_阿勒秋

設二維陣列為typename a[m][n],則指向該陣列的指標為typename (*p)[n] = a;這樣就可以用p來代替二維陣列了。

15樓:汐_楓

#include

void main()

16樓:

看你具體的應用,提供幾個方法供參考:

1、一級指標

例:int a[m][n];

int *p = &a[0][0];

相當於將二維陣列當一維陣列用,需要自己根據n的大小計算下標,使用卻很靈活

2、指標陣列

例:int a[m][n];

int *p[m];

for(int i=0; i

例:int a[m][n];

int (*p)[n];

p = a;

用起來跟二維陣列沒區別,缺點在於n是固定的4、二級指標

例:int a[m][n];

int **p;

p = (int *)malloc(sizeof(int *)*m);

for(int i=0; i

17樓:匿名使用者

#include

#include

void main()

c語言中如何通過二級指標來操作二維陣列

18樓:灩麗

1、首先我們開啟電腦裡的c語言軟體,新建一個工程和.c檔案,輸入標頭檔案和主函式。

2、然後我們輸入圖示**初始化陣列,定義變數型別。

3、然後我們輸入圖示**用for語句實現陣列的訪問。

4、然後我們輸入圖示**進行輸出。

5、然後我們輸入圖示**編譯、執行,即可通過二級指標來操作二維陣列。

19樓:小宇宙

倘若此時有一個二級指標

檔案中可以編譯通過,但會給出警告。若是在

.cpp檔案中則不會編譯通過!我相信很多人的第一反應是加上強制型別轉換:

q=(int**)a;

根據我上面講述的:q可視為int**型別,且是int*變數的地址型別變數!對q (指標變數)的引用,得到是的其(即q)記憶體單元的資料,即int*變數的地址,*q則是獲取q所指向的int*變數型別地址的內容,相當於int* q變數q的直接引用,得到是int型別變數的地址。

q所佔的記憶體為4byte,*q所佔的記憶體也為4byte

。一切都清楚了。

現在來分析二維陣列a的資料型別。我們知道指標與陣列的聯絡的常見具體應用有兩種:一種是「陣列指標」:形如(*ptr);另外一種是「指標陣列」:形如*ptr。

。來分析一下「陣列指標」(*ptr)[size],

ptr所指的物件是有size個某種資料型別值的陣列。而ptr本身又是一級指標,一級指標又等價於一維陣列。

a[2][3]的低維是一個維度為3的一維陣列。高維是一個維度為2的一維陣列,不難理解,正如前面所述:二維陣列的每個元素是一個一維陣列,相當於一維陣列的兩次巢狀。

比如變數a[0]是一個維度為3的一維陣列

,a[1]亦是一樣。這樣一來,高維的那一部分可視為一個指標!

一個膽大的設想出來了:二維陣列本質上就等同於「陣列指標」!

cout<

輸出結果為:int (*)[3](換行)int (*)[3]兩者完全相同,與設想一致!

現在回到問題上來,

q=(int**)a;

強制轉換成功,但卻不可能正確執行!

原因已浮出水面:q這個地址單元存放的是int*型別的「指標變數」的地址,而二維陣列a骨子裡卻是一個「陣列指標」。兩者完全是「八竿子打不著」!

想一想它們的記憶體分佈情況,前者(地址)所指向的記憶體大小恆為4byte

,後者(地址)所指向的記憶體大小是隨著你定義的陣列維數而不斷變化的!即使通過強制型別轉換成功,q的記憶體值就是a所代表的地址,但這個地址僅僅是一個地址,而q的記憶體值不僅要求是一個地址,而且還必須是一個「指標變數」的地址!只有這樣通過*q(前面說過:

*q則是獲取q所指向的int*變數型別地址的內容,即一個int變數的地址)才能操作一個普通變數的地址,否則就是用「*」來操作普通變數,想一下

int x=250;*x

又是「陣列指標」?這裡有必要強調一下:我是從它們的儲存映象上來講的,但編譯器的語義實現上兩者是絕不能劃等號的!

你能夠將一個二維陣列賦值給一個一維陣列嗎?顯然是不行的!因此我們這樣想:

語句q=(int**)a;

是將一個一維陣列(等價於一級指標)賦給一個二級指標(要通過「&」賦一級指標的地址才行)

,地球人都知道這是行不通的!雖然乍聽起來還蠻合理的,其實此般理解無異於穿鑿附會。剛才解釋過,兩者

的語義迥異!不過,這樣理解似乎更能深刻且方便地知道那樣做錯在**了,呵呵。

20樓:風若遠去何人留

通過二級指標去訪問二維陣列需要先給二級指標分配等同於二維陣列行數的一維陣列指標,然後把二維陣列的每行首地址賦值給對應位置的一維指標上。之後就可以通過二維指標直接訪問了。

參考**如下,可以看具體註釋輔助理解。

#include //輸入輸出標頭檔案。

#include //本程式需要用到malloc/free函式,引用該標頭檔案。

int main()

; //定義二維陣列a,並賦值從1-12.

int ** p = null;//定義二維指標。

int i, j;

p = (int **)malloc(sizeof(int *) *3);//要訪問的陣列有三行,所以申請三個一維指標變數。

for(i = 0; i < 3; i ++)

for(i = 0; i < 3; i ++)

free(p);//釋放申請的記憶體。

return 0;

}用二維指標訪問二維陣列多用於函式呼叫。

對於一維陣列,如果函式引數為一維指標可以直接用陣列名當做函式引數。但是如果函式引數為二維指標,直接用二維陣列名做引數會出現訪問出錯,是因為二維指標和二維陣列的訪問方式不同造成的,需要如示例**中做轉換。

另外一種常用的方法是利用二維陣列的記憶體連續性將二維陣列轉為一維陣列處理,與本題無關,不做更多描述。

c語言中如何通過二級指標來操作二維陣列

灩麗 1 首先我們開啟電腦裡的c語言軟體,新建一個工程和.c檔案,輸入標頭檔案和主函式。2 然後我們輸入圖示 初始化陣列,定義變數型別。3 然後我們輸入圖示 用for語句實現陣列的訪問。4 然後我們輸入圖示 進行輸出。5 然後我們輸入圖示 編譯 執行,即可通過二級指標來操作二維陣列。 小宇宙 倘若此...

c語言二維陣列問題

寫完以後我發現有點長,樓主給點耐心看,不懂我們再交流 a是整個二維陣列的首地址,short長度為2,sizeof a 2 5 5 50 a 1指向二維陣列的第二個元素,它僅僅是一個指標,如果在a 1前面加一個 號,就是第二個元素的值,即a 0 1 所以,a 1是一個指標,它指向二維陣列中的某個數,指...

c語言怎麼用指標代替二維陣列,C語言怎麼用指標代替二維陣列

1.設p是指向二維陣列a m n 的指標變數,則有 int p a 0 此時p是指向一維陣列的指標。p 後,p指向 a 0 1 2.如果定義int p1 n p1 a p1 後,p1指向a 1 0 則p j將指向a 0 陣列中的元素a 0 j 由於a 0 a 1 a m 1 等各個行陣列依次連續儲存...