——為何可以int (*p)[n]=&a[i],而不能p=a[i]賦值(0<=i<m)?
p是什麼?p首先是一個指標,存放了一個包含n個整型資料的陣列(姑且叫他陣列甲)的地址,這個時候我們可以認為陣列甲,是一個有很多個類似於陣列甲這樣的元素構成的陣列(我叫他陣列乙,很顯然,乙是個二維陣列,陣列的陣列)的首元素,陣列甲的地址就是陣列乙的首元素的地址,所以p就可以當作陣列乙的名字來賦值(二維陣列名,也就是a)。
現在a是二維陣列,先把a降維,看成是有m個元素組成的一維陣列。那麼a[0]是什麼?是a這個現在被我暫時看成一維的陣列的首元素。對首元素取地址,就是陣列名。所以a==&a[0]。以此類推,a+i==&a[i]。那麼a[0][0]又是什麼?是對a取星以後的a[0]的首元素,也就是陣列名,所以a[0]==&a[0][0],所以**a==a[0][0]==*(*(a+i)+j),只不過這裡ij都是0。
所以,p這麼一個指向陣列的指標,可以賦給它a[0]的地址(a的首元素地址,也就是a),p=a=&a[0],以此類推,p+i=&a[i]。所以你的p=a[i]不對,a[i]是降維之後a的第i個元素同時又是個一維陣列名,表示a[i][0]地址,只能賦給一個指向整型資料的指標。而你的p是個指向陣列的指標,賦值符號左右端型別不同,這上哪能賦值?
你後面這p=&a[i]語法上是不錯,但是是強制讓p指標下移i個位置了,因為p+i=&a[i](假設你已經賦值p=&a[0]),你這個不就相當於p=p+i,也就相當於p+=i。也不是個特別好的寫法。
另外,如果你再定義一個int *q; 然後q=a。這是可以的,a可以降維也可以不降維直接用。這時q=&a[0][0]
——在一維陣列中卻只能用p=a,而不能用p=&a.
在一位數組裡面,你就得這樣定義:int *p; 這樣p裡面存的是一個整型變數的“坑”的坑號。而一維陣列a陣列名不就是他自己首元素的坑的坑號?當然可以賦值p=a。
p=&a表示的是什麼?a本來就是一個地址,你還要再對a取地址,應該還是它本身,但是含義不同。非形引數組名都是指標常量,對指標常量取地址還是它本身(或者壓根取不了地址,因為常量可能沒地址)。你也可以在編譯器裡面打一下看看會不會報錯。
——為何可以int (*p)[n]=&a[i],而不能p=a[i]賦值(0<=i<m)?
p是什麼?p首先是一個指標,存放了一個包含n個整型資料的陣列(姑且叫他陣列甲)的地址,這個時候我們可以認為陣列甲,是一個有很多個類似於陣列甲這樣的元素構成的陣列(我叫他陣列乙,很顯然,乙是個二維陣列,陣列的陣列)的首元素,陣列甲的地址就是陣列乙的首元素的地址,所以p就可以當作陣列乙的名字來賦值(二維陣列名,也就是a)。
現在a是二維陣列,先把a降維,看成是有m個元素組成的一維陣列。那麼a[0]是什麼?是a這個現在被我暫時看成一維的陣列的首元素。對首元素取地址,就是陣列名。所以a==&a[0]。以此類推,a+i==&a[i]。那麼a[0][0]又是什麼?是對a取星以後的a[0]的首元素,也就是陣列名,所以a[0]==&a[0][0],所以**a==a[0][0]==*(*(a+i)+j),只不過這裡ij都是0。
所以,p這麼一個指向陣列的指標,可以賦給它a[0]的地址(a的首元素地址,也就是a),p=a=&a[0],以此類推,p+i=&a[i]。所以你的p=a[i]不對,a[i]是降維之後a的第i個元素同時又是個一維陣列名,表示a[i][0]地址,只能賦給一個指向整型資料的指標。而你的p是個指向陣列的指標,賦值符號左右端型別不同,這上哪能賦值?
你後面這p=&a[i]語法上是不錯,但是是強制讓p指標下移i個位置了,因為p+i=&a[i](假設你已經賦值p=&a[0]),你這個不就相當於p=p+i,也就相當於p+=i。也不是個特別好的寫法。
另外,如果你再定義一個int *q; 然後q=a。這是可以的,a可以降維也可以不降維直接用。這時q=&a[0][0]
——在一維陣列中卻只能用p=a,而不能用p=&a.
在一位數組裡面,你就得這樣定義:int *p; 這樣p裡面存的是一個整型變數的“坑”的坑號。而一維陣列a陣列名不就是他自己首元素的坑的坑號?當然可以賦值p=a。
p=&a表示的是什麼?a本來就是一個地址,你還要再對a取地址,應該還是它本身,但是含義不同。非形引數組名都是指標常量,對指標常量取地址還是它本身(或者壓根取不了地址,因為常量可能沒地址)。你也可以在編譯器裡面打一下看看會不會報錯。