今天在Gmail的群組討論貼中看到這樣一個文章:
[learn-linux-c-cpp] 一維數組轉成指向數組的指標收件匣x zhangzhe benzhemin@gmail.com11-10-28發送至 learning-linux. 還請大家討論一下:代碼:#include <stdio.h>int main(void){ int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int (*p)[2] = (int (*)[2])a; printf("%d\n", **p); printf("%d\n", **(p+1)); printf("%d\n", *a); return 0;}a只是一個指標,為何轉成int (*)[2]之後轉成了二維指標?事實上下面代碼也可以編譯運行通過。#include <stdio.h>int main(void){ int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int (*p)[2] = (int (*)[2])&a; printf("%d\n", **p); printf("%d\n", **(p+1)); printf("%d\n", *a); return 0;}難倒 int (*p)[2] = (int (*)[2])a; 和 int (*p)[2] = (int (*)[2])&a;兩種轉換是等價的嗎。
這裡明顯可以看到這位網友對概念的混淆,如下的描述。
a只是一個指標,為何轉成int (*)[2]之後轉成了二維指標?
我們知道在C語言中,數組名是一個常量,就是常說的const量,經過上面的變化,a並沒有變成int (*)[2]這樣的指標類型,它還是保持
原來的屬性;只不過是p是int (*)[2]這樣的一個指標類型,並且被使用者強制指向了a這個地址。這就是說如果用指標p訪問的話,那麼可以將a地址開始的
10個整數解釋成二維數組。
還有就是下面的這個描述:
難倒 int (*p)[2] = (int (*)[2])a; 和 int (*p)[2] = (int (*)[2])&a;兩種轉換是等價的嗎。
上面的這兩個描述是一致的, 因為在解析的時候: a 和 &a 的實質是一樣的,都是指向記憶體中固定的地區;因此兩種轉換是等價的。
這裡不多說了,歡迎園子裡的大俠們,對這個問題進行討論。
以上只是我個人的觀點,如有不當,請大家拍磚.........................