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語言
對 的註解 include void main while x 當 x為真時,就是說是非零 時繼續迴圈,否則停止迴圈,這裡停止的迴圈 關於x 是這樣的 對x做減運算,但是要先使用再做減運算,所以輸出時仍x是3,但是輸入之後x就變成2了。所以在後面的while x 中的x是2,因為沒有輸出所以是看不到...
求助啊,二級C語言題目,求助啊,二級c語言模擬上機軟體
首先,照你的描述,a b都是普通變數,他們是不能執行b a的,若如此,b必須是指標 即使如你所述,這可行,在執行b a後,b的地址已經變成了ef01,引用只是一個變數的別名而已,換句話說,在這裡的a就是b,b就是a,改變其中一個的值,a b的值都會變,因為他們共享一個地址,因此在執行y b後,y的地...
二級C語言的簡單問題
更正 不能是g,剛翻了下書,輸入沒有 g這東西。只能是 f scanf 8f c 是283.1900賦給c 小數點也算一位 而且輸入的話,不能控制小數點後面幾位,沒有 6.2f這樣的所以不能選c,如果c改成scanf 6f c 那麼也是對的 至於a,b都是明顯錯誤。什麼書上都會有錯誤的。如果方便的話...