2013-02-19 3 views
1

Пусть PTR некоторый указатель, то:значение * ((INT *) PTR + 1)

*((int *)ptr+1) 

означает, что:

первый тип броска PTR к Int *, то увеличивается на единицу, а затем разыменования ,

ИЛИ

первое приращение PTR на единицу, а затем приведение, а затем разыменовать.

+5

Проверьте ссылку [операторский приоритет] (http://en.cppreference.com/w/c/language/operator_precedence). –

ответ

3

Литье имеет более высокий приоритет, чем дополнение, c.f. here. Таким образом, сначала конвертируйте в целочисленный указатель, а затем добавьте 1*sizeof(int).

2

Это, скорее всего, короткая версия ptr[1], если указатель ptr является указателем int *.

так

первый приведение типа PTR в целое *, то увеличивается на единицу, а затем разыменования.

2

Первое предложение: Ввести ptr в int *, а затем увеличить на единицу и, наконец, получить int по этому адресу.

Это способ обработки структурированных данных, когда у вас есть, например, поток символов на входе.

3

ptr - указатель на что угодно. (int *) ptr является указателем на int, который указывает на то же место, что и ptr, но предполагает, что указатель будет int. (int *)ptr + 1 указывает на одну ячейку (aka. One int) далее в памяти. *((int *)ptr+1) - это int.

1
*((int *)ptr+1) 

, что означает:

  • incress указатель на следующее место в памяти (SizeOf (PTR))
  • затем отливали указатель на указатель целого числа.
  • затем получите первые sizeof (int) байты!
1

Этот код показывает довольно много, что вы делаете:

#include<stdio.h> 

int main() { 

    int onetwo[] = { 1, 2}; 
    /*create a void pointer to one two*/ 
    void* ptr = (void*) onetwo; 

    printf ("pointer onetwo[0] = %p\n", &onetwo[0] ); 
    printf ("pointer onetwo[1] = %p\n", &onetwo[1] ); 

    /* since you are doing pointer arithmetics 
    * it's really important you cast ptr back to 
    * int* otherwise the compiler might not 
    * return a pointer to onetwo[1] but if sizeof(int) 
    * is 4 bytes 
    */ 
    printf ("value = %d\n", *((int*)ptr + 1)); 

    /* in this print statement ptr is still a void* when 
    * it is incremented, therefore it points between 
    * onetwo[0] and onetwo[1] 
    */ 

    printf ("value = %d\n", * ((int*)(ptr + 1))); 

    /*casting to int* is for illustration properties */ 
    printf ("This points between onetwo[0] and onetwo[1] because it's at %p\n", (int*) (ptr + 1)); 


    return 0; 

} 

выход на моих выходах машины:

~/programming/stackoverflow$ ./p 
pointer onetwo[0] = 0x7fffdd8e2fc0 
pointer onetwo[1] = 0x7fffdd8e2fc4 
value = 2 
value = 33554432 
This points between onetwo[0] and onetwo[1] because it's at 0x7fffdd8e2fc1 

Я надеюсь, что это демонстрирует некоторые из эффектов указателя арифметики.

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