Указатель арифметики С и отливки - PullRequest
1 голос
/ 24 января 2012

Я видел очень странный фрагмент кода, и я не совсем уверен, правильно ли я понял:

#include <stdio.h>

int main(char *argc, char **argv)
{
   char a[50];
   *(char *) (a + 2) = 'b'; // <== THE LINE WHICH CONFUSES ME

   printf("value: %c\n", a[2]);
   return 1;
}

Правильно ли, что мы на 2 ведра далее приводим 'b' к указателю на b и затем разыменовываем его?

Ответы [ 5 ]

6 голосов
/ 24 января 2012

Это в точности эквивалентно

*(a + 2) = 'b';

Приведение не требуется.

Все, что он делает, это добавляет два к массиву, который распадается к указателю a,разыменуйте результирующий указатель и присвойте этой ячейке памяти символ 'b'.

Когда указатель a является указателем, код a[x] в точности эквивалентен *(a + x).Так что в вашем случае *(a + 2) = 'b' точно так же, как a[2] = 'b'.

3 голосов
/ 24 января 2012

*(char *) (a + 2)

эквивалентно

a[2]

По определению a[2] равно *(a + 2). Значение a + 2 уже имеет тип char *, поэтому приведение от a + 2 к char *, как и (char *) (a + 2), не является операцией.

2 голосов
/ 24 января 2012
 *(char *) (a + 2) = 'b'; // <== THE LINE WHICH CONFUSES ME

Эта строка буквально означает то же самое, что и

a[2] = 'b'

Первое приведение (char*) является избыточным, поскольку a уже имеет тип char. И индексирование фактически означает добавление и разыменование, т. Е.

a[n] === *(a + n)

Малоизвестный факт о C: Вы также можете написать

n[a]

и получите тот же результат.

1 голос
/ 24 января 2012

Нет, вы воспринимаете a как указатель, увеличиваете его на два, затем приводите к (char*) (бесполезное приведение, это уже char*), разыменовываете его и сохраняете 'b' в этом.

Это точно так же, как это:

a[2] = 'b';
1 голос
/ 24 января 2012

Вы не разыгрываете 'b'.

Вы разыгрываете (a+2) на char* (что ничего не делает, поскольку оно уже char*), преклоняете его и помещаете туда 'b'.

И да, это правда, что мы идем на 2 ведра дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...