c語言二級指標問題,C語言二級指標問題

時間 2021-08-14 06:07:21

1樓:匿名使用者

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

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

#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;

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

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

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

2樓:

在函式引數傳遞中只有值傳遞。

要看傳遞的值是什麼,如果是一個指標的值那麼它就是地址了。否則就是普通的值。

你這裡為什麼要用二級指標呢?你認為p的值已經是一個地址了所以直接傳它的值就可以搞定了。錯誤就在這裡。

你想想你為什麼還要為p開闢空間。如果p的值已經是你要的地址了那還需要開闢空間嗎。所以其實這裡要麼p的值是null要麼是一個隨即值,要麼是一個地址但不是你要的。

那麼你把這樣的值傳過去有什麼用呢。 所以這裡你要弄清楚我們真正要修改時是哪個的內容。是p所指向的那個記憶體嗎。

還是p本身,顯然這裡要該是p本身的內容。那麼你只把p的值傳給一個函式這個函式能修改p的內容嗎?顯然不能了。

所以我們得把p本身的地址傳過去。然後才能修改該地址的內容。所以就不得不用二級指標了。

3樓:

//給你看段**。

void myprintf(char *p)//然後在main中

int main()

/*這樣就是直接把p指向的地址傳給函式,函式並沒有 另開闢地址,只是傳了地址給呼叫的函式*/

c語言指標和二級指標問題 如果 int a[][3]={{1,2,3},{4,9},{7}}; int *p[3]={a[0],a[1],a[2]};

4樓:匿名使用者

從a的宣告來得知a是a[3][3]的二維陣列。自p是指標陣列,包含三個整形指標,分別質量二維陣列的三行**p相當於a[0][0]

*(*(p+i)+i 相當於a[i][i]*(*p+i)+3 相當於a[i][3]但由於陣列第二維的上限是3,所以其實是a[i+1][0]

p是二級指標,p+1移動的是一行,(*p)是一級指標,(*p)+1移動的是一個整形。**p是具體的元素了,不是指標了。

5樓:匿名使用者

語句不全,i沒有指明,把全程程式提供一下吧

C語言二級問題

你程式下面的第一句話很不嚴謹啊 呵呵 不加的話就變成了b 2.0.這是啥意思啊?開玩笑啦 double相當於double float的縮寫,意思是兩倍的float型別空間 可以儲存多倍於float的資料 不一定是兩倍,編譯器不同結果不同 當然,數字小的話沒什麼區別 下面是c 上的參考資料 float...

二級c語言的選擇題又麻煩大家了,二級C語言的選擇題 又麻煩大家了

犍為真人 20 每個case後都沒有出現break,所以它們會一直執行到最後,即執行到default,在default中出現v0 1,v2 1,所以輸入多少個字元,v0,v1就會增加多少。v1 1出現在case u 但是它之前的case中,都沒有break語句,所以,只要是a,a,e,e,i,i,o...

計算機二級C語言如何備考,計算機二級c語言考什麼

1 對於計算機二級c語言這個科目,只要肯花功夫準備,認真對待,多練習題目,多思考,多總結,理解了計算機語言的思維,就可以達到比較好的效果。c語言大多數知識還主要以記憶為主,多看別人寫過的程式,逐漸地總結出很多的方法。2 易錯點是那些基礎部分。例如乙個完整的語句結束時忘了加分號。逗號和分號的用法混淆。...