❶ 在c語言中怎麼樣得到二維數組的首地址哦
就這道題來說,雖然編譯器給出了對p=a的警告,但是程序仍然可以正確的運行。因為你的程序中並沒有對p進行二次解引用。詳細來說,執行p=a時,由於兩者類型不同,編譯器將a轉換成指向整型的指針,然後復制給p,所以p可以正確地指向二維數組的首元素a[0][0]。 最後我再解釋一下一些表達式的意思: a,a[0],&a[0][0],p均表示該二維數組的首地址。 &a[1][0],a[1],a+1,p+3均表示該二維數組中第二維的首地址。 a[0][1],a[0]+1,p+1均表示該二維數組中的第二個元素的地址。 p+n表示第n+1個元素。 理解上只要知道a[i][j]是元素,a[i]和p是指向整型的常指針,a是指向指向整型的常指針的常指針,也是數組的首地址就可以了。
❷ 關於c語言中二維數組的地址問題
C語言多維數組左邊下標變化慢,右邊快。內存存儲越靠右的下標越相鄰。
❸ C語言二維數組地址問題
1、&a[0][0]為0行0列元素的首地址,a[0]+n為0行第n個元素地址,那麼a[0]是表示0行首元素地址嗎?
>>正確, a[0]就是0行首地址.
&a[0]是零行的首地址,實際上行的地址也只有一個,也無所謂0行的首地址吧?
>>&a[0]值上, 是和a[0]相同的, 不過類型不一樣. a[0]等效於int *型,實際上是指向一個元素. 而&a[0]是行指針, 指向一行.所以,a[0]+n和&a[0]+n是完全不同的.
+n相當於元素位移了n個位置嗎,所以代表第n個元素地址嗎?
>>+n取決於原始指針的類型. 如果是a[0]+n 移動的是n個元素.而&a[0]+n就是移動n行了.
然後*(a[n]+m)就表示n行第m個元素了?
>>這句沒錯. 任何情況下, *(p+n)都等效於p[n]
2、書中寫a+n表示第n行的首地址,那是相當於&a[n]嗎,a不是表示數組首個元素地址嗎,怎麼+n不是元素位置改變,卻是位移了行?
>>這個上面說過了, 核心在於指針的類型. 二維數組int a[M][N]的數組名a, 本質上是常量的int (*)[N]類型, 也就是數組指針. 移動的時候是整行移動的.
還是a+n表示n行首個元素的地址?為什麼
>>同上
*(a+n)與a[n]是等價的,原理是什麼,*(*(a+n)+m)怎麼也能表示n行m列元素呢?
>>*(a+n)與a[n]等價, 這個是C語言的一個規則. 其本質是, 當編譯器遇到a[n]這樣的形式時, 實際上是翻譯成*(a+n)進行編譯的. 這種可以用一個很少見的形式來驗證.你定義
int a[4]={1,2,3,4}; 然後輸出
printf("%d ", 3[a]);
對, 就是把數組名放進[], 實際上會輸出a[3]
❹ C語言中如何用指針運算符來表示一個二維數組的元素及地址
二維指針,就是說第一維是指針,第二維還是指針;
拿*(*(a+i)+j)來說:a是數組的首地址吧,然後+i,就是說a地址向後偏移i位。就是a+i的地址了,注意,這里a+i只是地址,用*符號取出該地址的數據,就是*(a+i),這里*(a+i)就是第一維指針,它指的是地址,不是數據。
而且後面的*(a+i)+j就是說以*(a+i)為首地址,偏移j位,然後使用*取內容,這里就是第二維了,取到的數據就是實際數據了
❺ c語言,關於對數組名取地址
准確的說法,是變成了二級指針。
而二級指針,是指向指針地址的指針,變相相當於一個第一維度只有1的二維數組。
其中的根源,在於C語言中,聲明一個數組其實相當於申請了一個定長的指針(存儲位置不同,使用上還是有區別的),你可以將數組名當做指針使用,而反過來,也可以將一個指針,以數組的方式合法訪問其成員。而二維數組的聲明後,A[1][3],之後A[0]是一個一維數組,同樣A[0]保存的,也是這個一維數組的地址,A保存的是A[0]的地址,和二級指針相同。
❻ C語言 二維數組 取首地址 所得到的 地址 和 居然首地址相同
這是很正常的。二維數組的地址就是它首元即第一個一維數組a[0]的地址,而一維數組a[0]的地址又是它的首元a[0][0]的地址。所以三者是相同的。
❼ C語言:定義一個2行3列的浮點型二維數組,並將每個元素的地址輸出
您好,你的問題,我之前好像也遇到過,以下是我原來的解決思路和方法,希望能幫助到你,若有錯誤,還望見諒!展開全部
#include<stdio.h>
void main()
{
int a[2][3],i,j,sum=0;
printf("請輸入數組元素:\n");
for(i=0;i<2;i++)
for(j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
}
printf("每行的和分別為:\n");
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
sum += a[i][j];
}
printf("%d\n",sum);
sum=0;
}
printf("每和分別\n");
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
sum += a[j][i];
}
printf("%d\n",sum);
sum=0;
}
}非常感謝您的耐心觀看,如有幫助請採納,祝生活愉快!謝謝!
❽ c語言的二維數組地址問題
答:
二維數組
a[3][4]中,a[1]+1是數組a[1]的第2個元素的地址,a[0]+4是數組a[0]的第5個元素的地址,但a[0]只有4個元素,所以a[0]+4就是a[1]首元素的地址,因此這是兩個不同的地址。
另外,也可以將二維數組a[3][4]看成一維專數組a[12],那麼原來的a[1]+1就是
一維數組
的a[5]的地址,而原來的a[0]+4是一維數組的a[4]的地址,由此可見屬,這是兩個不同的地址。
❾ c語言二維數組地址問題 求大神講解!!
圖中的首地址應該是16進制0x2000,表述不太嚴謹。你的分析不正確,a[1][0應該比首地址偏移4個int,也就是偏移16位元組。0x2010比0x2000正好大16。