Инициализация указателей в C ++ - PullRequest
9 голосов
/ 23 мая 2009

Может ли указатель указывать значение в объявлении? Примерно так:

    int * p = &(1000)

Ответы [ 4 ]

23 голосов
/ 23 мая 2009

Да, вы можете инициализировать указатели на значения в объявлении, однако вы не можете сделать это:

int *p = &(1000);

& - это адрес оператора , и вы не можете применить это к константе (хотя, если бы вы могли, это было бы интересно) Попробуйте использовать другую переменную:

int foo = 1000;
int *p = &foo;

или типирование:

int *p = (int *)(1000); // or reinterpret_cast<>/static_cast<>/etc
7 голосов
/ 23 мая 2009

Есть две вещи, неясные для меня в этом вопросе. Вы хотите установить указатель на определенное значение (то есть адрес), или вы хотите, чтобы указатель указывал на какую-то конкретную переменную?

В последнем случае вы можете просто использовать адрес оператора. Значение указателя затем устанавливается на адрес из some_int_variable.

int *p = &some_int_variable;
*p = 10; // same as some_int_variable = 10;

Примечание : Далее следует злое изменение значения указателя вручную. Если вы не знаете, хотите ли вы это сделать, вы не хотите этого делать.

В первом случае (т. Е. Установка какого-то определенного, заданного адреса) вы не можете просто сделать

int *p = 1000;

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

int *p = reinterpret_cast<int*>(1000);

Теперь указатель будет ссылаться на некоторое целое число (надеюсь) по адресу 1000. Обратите внимание, что результат определяется реализацией. Но тем не менее, это семантика, и именно так вы говорите об этом компилятору.

Обновление : Комитет исправил странное поведение reinterpret_cast<T*>(0), которое было предложено в записке и для которого я уже предлагал обходной путь. Смотрите здесь .

5 голосов
/ 23 мая 2009

А как же:

// Creates a pointer p to an integer initialized with value 1000.
int * p = new int(1000); 

Проверено и работает. ; -)

2 голосов
/ 23 мая 2009

Um. Я не думаю, что вы можете взять неконстантный адрес такой константы.

но это работает:

int x = 3;
int *px = &x;
cout << *px; // prints 3

или это:

const int x = 3;
const int *px = &x;
const int *pfoo = reinterpret_cast<const int*>(47);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...