2011-12-28 14 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

「ポインタのメモリ」のようなものはありません。おそらくあなたは「ポインタを操作する」ことを意味しましたか? –

+0

' - >'演算子を使うのではなく、なぜこれをやりたいのですか? –

+0

@ mr.anubisもちろんです。 –

答えて

1

ポインタ型は、増分が正しいサイズ追加右ようにする必要がある:

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

編集:任意のCプログラマとしてを知っている必要があり、構造体のメンバにアクセスするためのポインタ演算を使用することは無駄であると危険です。 ->の操作は、名前付きメンバにアクセスする際にははるかに簡潔で正確です。ポインタ演算を単純に使用すると多くの問題が発生するため、危険です。しかし、ポインタ演算はOPが要求したものなので、ポインタ演算は彼が得たものです。

+0

structが 'struct foo {char d;テレビで; } 'の場合は、行を再編集する必要があります。 –

+0

@ Mr.Anubis:パディングに依存します。 OPがポインタ演算を使用して(なぜなら ' - >'ではなく)メンバーにアクセスしたい理由が分からないので、この質問が発生しないことを願っています。 – thiton

+0

これは標準ではありません。 –

10

使用stddef.hで提供offsetofマクロ:

#include<stddef.h> 

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

他の方法は、パディング/アライメントの問題に実行されます。

関連する問題