回覆列表
  • 1 # 手機使用者84838169517

    先上結論:不是。

    (1)指標是什麼?

    簡單來說是一種存放地址的資料型別。

    (2)陣列是什麼?

    陣列是很多程式語言中最基本的資料結構,是同一類元素的集合,在記憶體中連續存放。以C語言為例,如下的程式碼:

    表示一個叫做a的int型陣列,其資料成員是1,2,3,分別可以用下標0,1,2去索引。

    其中,a是一個地址,透過這個地址可以索引到陣列中的第一個元素,如下:

    上述語句和:

    的效果完全一樣,這樣我們就順帶理解了*運算子和[]運算子的關係:前者表示把一個地址裡的東西取出來,後者表示從一個首地址開始計算偏移,然後把裡面的東西取出來,即a[k]等價於*(a+k),這樣,順帶我們也學會了一種C語言裡的奇技淫巧:

    注意,到目前為止我並沒有下結論說a就是一個指標常量。。為什麼呢?因為把a簡單理解成指標常量,有幾個現象沒法解釋:

    ①詭異的取地址

    上述程式碼直接列印了a這個值,其中,a和&a的值是一樣的,但是a+1和&a+1就不一樣了,為什麼?其實從另一個角度來理解a就清楚了。事實上,a代表的是int [3]這個型別,對a取地址得到的仍然是a的地址,但是對&a加1的偏移則是3個int的大小,因此得到的結果是6487628。

    ②詭異的sizeof

    第一個打印出來的大小就是整個陣列的大小,即4*3=12byte,只能把a當成int [3]型別才解釋得通。

    第二種初始化陣列的方式是不是很少見。。但是這麼寫是可以的!這個b是啥?是指標嗎?那給這個指標取地址不是地址的地址嗎??混亂了吧。。。但是把b理解成int[3]就好辦了,上面的程式碼無非就是把一個int[3]賦給了另一個int[3],完全可以。

    看到這裡。。。是不是有點疑惑。。怎麼a一會兒是元素首地址,一會兒又表示一個型別。。其實這都是C語言中萬惡的隱式轉換規則造成的。

    (3)隱式轉換

    C語言欽定的,除開上面三種詭異的情況,陣列名都會被隱式轉換成一個指標常量。所以才能有:

    這樣的操作。

    好了,鋪墊結束,回到二維的情況。

    其實,本來是沒有所謂的二維陣列的,所有的東西都是一維的。

    這樣的程式碼,申明的仍然是一個一維陣列,只不過每個陣列元素是int [4]。

    如果你寫一段這樣的程式碼:

    馬上就會被編譯器暴打,告訴你不能從int(*)[4]轉換成int**,所以看清楚了吧,a是一個int(*)[4]型別,不是int**!!那麼這個int(*)[4]表示什麼呢?你可以這樣理解:*告訴我們這是一個指標,指向的是int [4]這個型別,想象一下,在記憶體中每個int [4]排成一行,這個指標就指到行頭,每一次加減1的偏移都是4個int,也就是移動到了下一行,所以說,這個鬼東西也叫做行指標。

    希望有幫助。

  • 中秋節和大豐收的關聯?
  • 為什麼一些人在床頭都習慣放紙巾?