1樓:赤水雲
要想直接把乙個二維陣列名賦給乙個指標,這個指標必須是行指標或二級指標才可以;
因為在c程式設計系統中,對於二維陣列會看成陣列元素為一維陣列的一維陣列,即對於二維陣列aa[2][3],系統會看成aa[0]和aa[1],而aa[0]和aa[1]中分別包含三個元素,這就是系統對於二維陣列的處理;
所以直接把二維陣列名賦給乙個普通的指標變數,這個指標是指向元素aa[0]的,但實際上呢,aa[0]不是乙個具體的元素,而是元素aa[0][0]的位址;
所以只有把陣列名賦給二級指標它才指向乙個具體的元素。
二維陣列名不能說是二級指標,不能按指標的思路來理解二維陣列,要按一維陣列的思路來理解,即按照系統的理解方式會簡單些。
*(a+0)==>a[0]是第乙個一維陣列的陣列名和首位址
*a==>*(a+0)==>a[0]是第乙個一維陣列的陣列名和首位址
int a[3][4]=,,}
設陣列a的首位址為1000。
從二維陣列的角度來看,a是二維陣列名,a代表整個二維陣列的首位址,也是二維陣列0行的首位址a+1代表第一行的首位址。
a[0]是第乙個一維陣列的陣列名和首位址,因此也為1000。*(a+0)或*a是與a[0]等效的, 它表示一維陣列a[0]0 號元素的首位址,也為1000。&a[0][0]是二維陣列a的0行0列元素首位址,同樣是1000。
因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。
同理,a+1是二維陣列1行的首位址,等於1008。a[1]是第二個一維陣列的陣列名和首位址,因此也為1008。&a[1][0]是二維陣列a的1行0列元素位址,也是1008。
因此a+1,a[1],*(a+1),&a[1][0]是等同的。
由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。
此外,&a[i]和a[i]也是等同的。因為在二維陣列中不能把&a[i]理解為元素a[i]的位址,不存在元素a[i]。c語言規定,它是一種位址計算方法,表示陣列a第i行首位址。
由此,我們得出:a[i],&a[i],*(a+i)和a+i也都是等同的。
另外,a[0]也可以看成是a[0]+0,是一維陣列a[0]的0號元素的首位址,而a[0]+1則是a[0]的1號元素首位址,由此可得出a[i]+j則是一維陣列a[i]的j號元素首位址,它等於&a[i][j]。
由a[i]=*(a+i)得a[i]+j=*(a+i)+j。由於*(a+i)+j是二維陣列a的i行j列元素的首位址,所以,該元素的值等於*(*(a+i)+j)。
2樓:毆零
指標變數是被某種變數型別派生出來的。
b是int (*)[3],
p是int*,
*b是int*,
b,&b[0]和&b[0][0]位址是同樣的值,但意思不一樣。
b,&b[0]是nt (*)[3],&b[0][0]是int*你把b+1, &b[0]+1,&b[0][0]+1打出來看看,想想。
如果你想只是放乙個位址的話,你應該用void *。
void *p=b;
當然你把b強制轉換成int *
int *p = (int *) b;
都是能通過的。
但是沒有型別那麼同樣的乙個位址,*b應該是什麼?
你如果用void *p=b;那麼在後面使用直接使用*p的時候會報錯。
因為編譯器不知道p的型別,不知道怎麼解釋p中的值。
希望你看了這些能明白,不明白的話建議你去買本《完全征服c指標》看看。
3樓:
指標和指標不一樣,是有型別的,型別不同不能賦值。。。雖然指標本質上都是乙個位址值,但還是不允許不同型別指標相互賦值,主要是為了防止濫用指標,導致出錯也不好察覺,但還是有賦值方法,那就是可以強制轉換。。。。
b並不是int *型的指標,所以不能賦值給p。。。。 指標型別不同最大的區別就是運算時偏移的位址不同。。。同樣是 b+1 ; 假設b=1000 ,是char 型, b+1的值為1001,int為 1004,long是
1008, int (*b)[3], 就是1012;
4樓:匿名使用者
int *p=b; //不可通過
int *o=b+0 //不可通過
int *u=b+1 //不可通過
b是二維陣列,即使退化也是int**
int *i=*b; //可以通過
int *y=*(b+0); //可以通過
int *t=*(b+1); //可以通過
這裡的*b、*(b+0)、*(b+1)相當於b[0]、b[0]、b[1]型別是int*。
c語言二維陣列的位址為什麼 不可以賦值給指標變數?
5樓:自我程式設計
二維陣列抄的陣列名和襲
一維陣列的
陣列名不一樣。bai
一維陣列名dua表示其首位址zhi,指標型別是(int *)。
二維數dao組名d表示其行指標,指標型別是(int (*)[7])。
所以你要定義指標去用二維陣列名賦值,需要定義指標int (*k)[7];不是int *k。
或者你把二維陣列當成一維陣列來看(二維內部位址是連續的,和一維一樣),這樣int *k;k=&d[0][0];之後通過k++遍歷二維陣列所有值。
二維陣列名不能賦值給乙個指標變數?
6樓:韶秀榮堵子
我理解你的問題是不是這樣:int
a[3][4];
int**p
=a;為什麼會報錯是吧?
回答:你理解的是對的,但是錯在,a是指向一維陣列,p是指向int*,這兩個不等價。
a指向一維的int陣列,記憶體大小為sizeof(int)*陣列長度;
而p只是指向乙個int*型別指標,記憶體大小為4。指標指向的型別實際是不同的。
這裡你可能又有疑惑,為啥int
b[10]一維陣列就可以賦值給int*pb=b呢,這是因為陣列退化到指標,只有第一維的陣列可以不確定陣列長度,可以直接作為首位址。有「陣列名能否作為右值」的討論。
如果想實現指標賦值,可以這樣int(*p)[4]=a;
這樣定義你就可以理解,p是乙個指標,指向int[4]一維陣列
c二維陣列名指的是陣列的首位址嗎
祿學校寄藍 是的,你可以試試看,比如int arr 4 4 cout arr arr 0 0 比較一下陣列名和陣列第乙個元素位址的值比較一下,看是不是相等 陣列名所代表的資料型別是指標常量,二維陣列就是指標的指標 二重指標,二重指標所存的內容就是一重指標的位址。所以二維陣列代表的是二重指標常量,所儲...
一維陣列和二維陣列有什麼區別麼,C語言中一維陣列與二維陣列有什麼區別和共同點?
小周高等教育 答疑 單行或單列的陣列,稱為一維陣列,多行多列 含2行2列 的陣列是二維陣列。陣列和陣列公式的區別 陣列,就是元素的集合,按行 列進行排列。陣列公式 就是包含有陣列運算的公式。ctrl shift enter,三鍵結束,這個過程就是告訴excel請與陣列運算的方式來處理本公式,反饋一個...
為什麼int a3和int a3不能正確二維陣列
嘿嘿 你這樣定義的話 編譯器無法識別第一位的個數 陳學陽 int a 3 2 這個語句語法是錯的,錯在二維陣列的初始化。初始化值要放在花括號裡。int a 3 二維陣列宣告,其中一維大小不定。陣列的初始化不要求全部元素都賦值,所以 int a 3 初始化 a 0 0 等於6 int a 3 初始化 ...