2011-12-28 68 views
1

如何使用指針運算來打印結構的特定成員?我有一個2個成員的結構。我想通過操作指向該結構的指針的內存來打印出成員j帶結構的指針運算

#include <stdio.h> 
#include <conio.h> 

typedef struct ASD 
{ 
    int i; 
    int j; 
}asd; 

void main (void) 
{ 
    asd test; 
    asd * ptr; 

    test.i = 100; 
    test.j = 200; 
    ptr = &test; 

    printf("%d",*(ptr +1)); 

    _getch(); 
} 
+0

沒有「指針的記憶」之類的東西。也許你的意思是「操縱指針」? – 2011-12-28 15:32:39

+0

你爲什麼要這樣做,而不是使用' - >'運算符? – 2011-12-28 15:33:00

+0

@ mr.anubis當然是。 – 2011-12-28 15:43:01

回答

1

指針類型,從而讓增量添加正確的尺寸是正確的:

printf("%d",*(((int*)ptr) +1)); 

編輯:作爲任何C程序員應該知道,使用指針運算訪問結構成員是沒用的和危險的。沒用,因爲->操作在訪問指定成員時更加簡潔和精確,而且由於天真使用指針算術會導致一系列問題,所以很危險。然而,指針算術是OP要求的,所以指針算術就是他得到的。

+0

如果結構是struct foo {char d; int v; }',那麼你將不得不重新編輯這一行。 – 2011-12-28 15:39:33

+0

@Anubis先生:取決於填充。不知道OP爲什麼要使用指針運算來訪問成員(而不是' - >'),所以我希望這個問題不會出現。 – thiton 2011-12-28 15:41:35

+0

這是非標準的,所以不應該是首選! – 2011-12-28 17:29:12

10

使用offsetofstddef.h提供:

#include<stddef.h> 

main() 
{ 
    asd foo = {100, 200}; 
    unsigned char* bar = (void*)&foo; 
    printf("%d\n", *(int*)(bar+offsetof(asd, j))); 
} 

任何其他方式運行到填充/對齊問題。