Инициализация указателей, разница между компиляторами c и c ++ (gcc-4.3.4) - PullRequest
0 голосов
/ 27 ноября 2011

мои попытки лучше понять указатели, я написал этот код:

int *a = 17;

printf("%d", a+3);

Он прекрасно скомпилирован под c с помощью gcc-4.3.4: http://ideone.com/abotd

И все же он не смог скомпилироваться с c ++: http://ideone.com/IdGHy

Я хотел бы знать, почему.

Кроме того, вывод, как вы можете видетьиз первой ссылки - 29. Я псевдо-понимаю, что происходит: sizeof (int) равен 4, и когда я написал + 3 вместо добавления 3 к 17, добавляется 3 * 4.

Тем не менее,Буду признателен, если кто-нибудь сможет объяснить это более красноречиво.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 27 ноября 2011

Для версии C ++ попробуйте это:

int *a = (int *)17;
printf("%d", a + 3);

И да, ваше объяснение верное ...

Это называется арифметикой указателей и работает так, как вы сказали.Однако обратите внимание, что код, который вы используете здесь, где вы присваиваете постоянное значение указателю на int, редко делается в реальной жизни.Значение указателя обычно исходит из некоторого рода функций выделения памяти, например, malloc в C или new в C ++ (хотя new не является функцией).

3 голосов
/ 27 ноября 2011

Неправильный код C ++.

int * a = 17;

Это недействительно. Вы не можете неявно преобразовать int в указатель. Вы могли бы разыграть это, но я бы не стал это делать на вашем месте.

2 голосов
/ 27 ноября 2011

Вы хотите что-то вроде:

int foo = 17;
int* a = &foo;
printf("%d\n", (*a) + 3);

Код, который вы разместили, пытается установить указатель на адрес в 17, который, вероятно, не является действительным адресом, и даже если бы вы былиНужно привести от int к указателю (int* a = (int*)17;).Затем вы добавляете к этому адресу и выводите адрес, который на три int размера выше него.Я действительно не думаю, что это то, что вы хотите.

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