[英]I don't understand C pointers
我真的不明白為什么我獲得的地址與我期望的不同。
我嘗試使用-m32
標志選項構建這個小 C 代碼。
#include <stdio.h>
#include <stdlib.h>
char *Buffer[10];
int main (void){
printf("%p\n", Buffer);
char *Buffer2 = Buffer + 6;
printf("%p\n", Buffer2);
}
預期輸出:
Buffer = 0x56559040
Buffer2 = 0x56559046
獲得的輸出:
Buffer = 0x56559040
Buffer2 = 0x56559058
為什么獲得的輸出與預期的不同(0x56559040 + 6 = 0x56559046)?
這兩個值的區別
Buffer = 0x56559040
Buffer2 = 0x56559058
是0x18
或十進制24
。
在本聲明中
char *Buffer2 = Buffer + 6;
數組指示符Buffer
被轉換為指向其第一個元素的指針。 由於數組Buffer
的元素類型是char *
因此表達式的類型為char **
。
類型char *
(變量Buffer2
的類型)和char **
(初始化器的類型)之間沒有隱式轉換
所以編譯器至少應該發出警告。
然而使用指針算術這個表達式
Buffer + 6
被評估為
the value of the address pointed to by Buffer + 6 * sizeof( char * )
由於系統中char *
類型的指針(數組元素的大小)的大小等於4
那么您將得到值 0x56559058,即
0x56559040 + 6 * sizeof( char * )
^^^^^^^^^^^^^^^^
4
這就是表達
Buffer + 6
指向數組 Buffer 的第六個元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.