c語言中為什麼一維陣列名可以賦值給乙個普通的指標,二維陣列名卻不可以賦值給乙個指向指標的指標?

時間 2021-05-11 18:55:56

1樓:yihonge

可以,不過有編譯」警告罷了。警告是在提示你可能存在潛在問題,而不是不能這樣做,你完全可以強制轉換。編譯器行為罷了,就像char* s = "hello";其實字串常量應該是const char*,但是C編譯器偏偏沒有警告,C++編譯器就會有警告,因為C++的型別檢查比C嚴格。

至於為什麼有警告:

拋個問題給題主,int a[5]; 請問&a的型別是什麼?

明白了,也就知道了。

2樓:C語言答疑課堂

我覺得能提出這個問題的人,對指標是真正地思考過的。這個問題的答案也很簡單,就一句話「不同型別的東西不能互相賦值」。舉個例子:

家貓、野貓和獅子都是貓科動物,家貓和野貓可以繁衍出後代,而家貓和獅子是沒法繁衍出後代的。你看,同屬於貓科動物的它們不一定都能繁衍後代。

回到這個問題上,我們以int a舉例,a是陣列名,它本質上是int *型別的指標,而普通的指標p如果也是int *型別的話,那麼a就可以賦值給p,也就是a是家貓,p是野貓,都是同乙個子科目,它們可以繁衍後代。

二維陣列int b的陣列名b,本質上是int (*)型別的指標,指標的指標int **q的型別是int **,倆不同型別的東西不可以互相賦值***這裡如果b是家貓的話,q就是獅子,是倆不同的子科目,不可以繁衍後代。

所以,它們看著都是指標,但是指標的型別也分好幾種呢,就是這麼簡單咯!

3樓:emmm

經過大佬 @左江 提醒,不同型別的指標做型別強轉還是會被編譯器搞鬼的,被稱為「嚴格別名規則」,讀書少確實不太行。這規則確實會給編譯器優化提供一定的操作空間,但是確實容易限制程式猿的發揮(;︵;`)。有興趣的盆友可以去看看gcc官方文件:

建議題主不要聽那些說指標跟陣列是一回事的人瞎BB,型別什麼的,都是浮雲。指標是根針,陣列是個池子,能有啥關係?

只是恰好,多維陣列是陣列的陣列,陣列指標的偏移量粒度等於該陣列型別的長度而已

陣列跟指標,是毫不相干的倆東西,只是某些情況下看起來比較像。

陣列名是個特殊的指標常量,陣列跟指標沒關係。其實作為解引用符號時,方括號下標和星號都是專屬於指標的,跟陣列沒關係,之所以可以用來表示對陣列元素的索引,只是對陣列名這個特殊的指標常量的解引用而已。陣列是個池子,指標是根針,能有關係才見鬼。

另,附上c裡一加一可以等於很多數的表示式

c裡,乙個數等於多少,取決於倆東西:

1.實際儲存介質中儲存的內容,

2.讀取它的方式(即認為該位址上儲存的型別是啥)

即說到底指標有且僅有倆屬性:值和型別

陣列有且僅有倆屬性:陣列長度和陣列維數

本來倆毫不相干的東西,只是有些時候看起來有點像,但是不要被表象迷惑,畢竟只是看起來而已。

4樓:止步吧

在C語言中,陣列在多數表示式中(例外包括取址&和sizeof),隱式轉換為指向其首元素的指標右值,稱為陣列退化。

二維陣列的元素是一維陣列,因此其退化後的型別是指向一維陣列的指標,而不是指向指標的指標。

5樓:shzy

沒怎麼用過。不過「指向指標的指標」那是二級指標啊。和你二維陣列有什麼關係。c語言的二維陣列實際上在記憶體模型上就是所謂的「一維」連續陣列。就是個普通指標而已。

c語言中對陣列名取位址會發生什麼?

陣列名本質是指標.我個人不建議這樣理解,我也可以說指標本質是整型數,整型數本質是010101.intarr 10 cout arr name endl int 10 長度為10的存有int的陣列 cout arr name endl int 10 指向 長度為10的存有int的陣列 的指標 cout...

C語言中多維陣列是否慢於一維陣列?

土地測量員 對於在全域性或者棧上分配的多維陣列 也就是位址是連續的 都可以看成是一維陣列模擬出來的,要訪問某個元素肯定存在著計算偏移量的過程,不過是交給編譯器幫你來完成這個過程了 其實可以看成語法糖的樣子?所以它比起一維是要慢一點。不過很多時候,某些東西從邏輯上來講就是多維的,你用一維的思路無法解決...

c語言中為什麼不能用char 指向字元陣列?

心不變情依舊 char 是二級指標,表示指標的指標,就是把不連續的空間連線起來,第乙個指標指向char 而char 可以表示一階陣列。 喵NLI 因為char z不是指標,是直接存放於棧中的陣列,這種情況下r z與r z都是獲取到z這個陣列的位址而不是二級指標 charz hello char y ...