為什麼不能把二維陣列名行的首位址賦給指標

時間 2021-09-11 22:25:31

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 初始化 ...