糾結的陣列名之問題

2022-11-29 06:01:12 字數 1951 閱讀 9117

1樓:匿名使用者

樓主的某些概念弄混淆了。

指標:什麼是指標,簡單說來就是位址,乙個位址裡面存放著另外乙個位址,通過訪問這個位址裡的位址,就可以訪問指標指向位址。

所以陣列名是不是指標?不是的,陣列名並不是乙個變數,並不是在乙個位址裡儲存了陣列的首位址。它只是陣列首位址的標識。

在程式語言中,乙個變數名就是乙個位址的標識,因為如果在乙個高階程式語言裡,0xa2038cd0這樣的位址可能會讓人很疑惑,如果是乙個英文名字就很容易懂這個變數是幹啥用的。而不管什麼程式語言,最終都會生成機器碼,即只有機器識別的語言。如下文的0002d c7 45 d4 08 00,這個機器碼一般人根本看不懂,

對應彙編:mov dword ptr _b$[ebp+4], 8 彙編就容易看懂

是取陣列b的首位址然後偏移4,將8賦給這段位址,

也就是c語言中的b[1] = 8這個語句

從彙編及機器碼的角度來看陣列和指標可能會清晰點。

訪問陣列元素直接首位址+偏移量 就可以直接訪問,

而如果是乙個指標的話,需要先從指標中去指向的位址,然後通過偏移訪問。

void null()

; 5 : int a = 10;

00018 c7 45 fc 0a 00

00 00 mov dword ptr _a$[ebp], 10 ; 0000000ah

; 6 : int *p = null;

0001f c7 45 f8 00 00

00 00 mov dword ptr _p$[ebp], 0

; 7 : int b[10];

; 8 : b[0] = 9;

00026 c7 45 d0 09 00

00 00 mov dword ptr _b$[ebp], 9

; 9 : b[1] = 8;

0002d c7 45 d4 08 00

00 00 mov dword ptr _b$[ebp+4], 8

; 10 : p = &a;

00034 8d 45 fc lea eax, dword ptr _a$[ebp]

00037 89 45 f8 mov dword ptr _p$[ebp], eax

; 11 : p = b;

0003a 8d 4d d0 lea ecx, dword ptr _b$[ebp]

0003d 89 4d f8 mov dword ptr _p$[ebp], ecx

; 12 : *(p + 3) = 7;

00040 8b 55 f8 mov edx, dword ptr _p$[ebp]

00043 c7 42 0c 07 00

00 00 mov dword ptr [edx+12], 7

2樓:匿名使用者

所謂常量,就是唯讀變數,也就是去除了寫的功能的變數;

所謂標籤,是編譯器在編譯的時候用來確定特定字串在源**中含義的對映,編譯結束就不存在於程式當中了,但是還保留在源**中,籤+偏移量,就是ox0034f34f+ox00000004之類的東西,直接操作記憶體了的。

「所以陣列名不占用儲存空間」是編譯器用的。「陣列名」是「編譯器在編譯的時候」使用的標籤,是「供給『編譯器』」使用,而不占用儲存空間。

上面兩句正確

「但」其內部有a[0]的位址。在訪問陣列的時候,就把「編譯器使用的『陣列名』的位址賦給需要訪問陣列的占用記憶體的指標」

上面兩句只在編譯時正確,執行exe時已經沒有標籤了。

在編譯a[0]時就已經確認好操作位址了,在執行exe時,已經不關標籤的事,直接找位址了,標籤叫神馬名字,理論上在exe都一樣,無差別。

作用類同於乙個指標。這句錯誤,語法上等同,作用上不同。指標在exe中仍然存在,而執行exe時已經沒有標籤了。

但其實它「不是指標」。這句正確。

C中陣列名a和a的不同之處,陣列名a和a有什麼不同

c c 裡面的陣列名字抄會退化為指標,襲所以陣列名a實際指的是 陣列的第乙個元素的位址。而陣列名作為指標來講有特殊性,它正在它所指向的記憶體區域中,a的值和a的數值是相同的 可以輸出觀察一下 但是型別和意義不同。而指標的加法操作和指向的資料型別密切相關。比如 int a 10 a就相當於int 如果...

二維陣列名和指標的關係,C語言中陣列名和指標的區別

二維陣列名即陣列地址,指向首行地址,表面上看,行地址即一維陣列指標,而陣列名指向行就應該是指標的指標,但是必須注意指標也是有型別的,型別不同資料寬度也不同。如果a 10 10 假設int p a 那麼要對行遞增執行p 時,編譯器如何知道列寬?因為int 是指指向一個 int 型別的指標,32位系統中...

C語言中陣列名就是陣列的首位址,怎麼解釋?哥們菜鳥

哥們應該寫錯了吧,陣列名應該是a,以你的例子為例。int為型別說明符,a為說組名,3 20 是常量或者常量表示式 c語言預設陣列名a為陣列首位址 希望對你有幫助 樓主,你定義了乙個二維陣列,但你弄錯了一點,陣列名是a而不是你說的a 3 20 對於二維陣列a是指向行的而不是指向列。陣列名a是二維陣列第...