簡體   English   中英

我不懂 C 指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM