2011-12-28 6 views
1

Как напечатать конкретный элемент структуры, используя арифметику указателя? У меня есть структура с двумя членами. Я хочу напечатать член 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)); 

Edit: Как любой C программист должен знать, используя арифметику указателей для членов структуры доступа бесполезно и опасно. Бесполезно, потому что операция -> намного более кратка и точная при доступе к именованному члену, и опасна, потому что наивное использование арифметики указателя приведет к ряду проблем. Тем не менее, арифметика указателей - это то, что запросил ОП, поэтому арифметика указателя - это то, что он получил.

+0

Что делать, если struct является 'struct foo {char d; на телевидении; } ', вам придется переделать строку. –

+0

@ Mr.Anubis: зависит от прокладки. Не знаю, почему OP хочет использовать арифметику указателей для доступа к членам (вместо '->'), поэтому я надеюсь, что вопрос не возникает. – thiton

+0

Это нестандартное и поэтому не должно быть предпочтительным! –

10

Используйте offsetof макрос приводится в stddef.h:

#include<stddef.h> 

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

Любой другой путь проходит в вопросах заполнения/выравнивания.

Смежные вопросы