2015-01-11 5 views
0

У меня странный вопрос. Рассмотрим следующий код:Указывая на индивидуальный адрес

char *ptr = 'A'; 

ptr укажет адрес 0x41. Я знаю, что вы не можете просто разыменовать этот указатель. Как сделать аналогичный код, который сделает ptr указывать на адрес, который создается строкой? Например, если у нас есть строка «abc», то адрес, на который указывает ptr, является значением этой строки. Это не то, что я ищу:

char *ptr = "abc" 

, так как он будет делать точки PTR памяти, где находятся строка а.

Что будет самой длинной длиной этой строки, что мы сможем сделать (на 32-битной машине)

+0

Что вы подразумеваете под «значением строки»? Что такое значение «HELLO»? – Mat

+0

Пожалуйста, перефразируйте свой вопрос. Я не понимаю, что вам нужно. – Gopi

+0

Действительно ли компилируется 'char * ptr = 'A''? – Wolf

ответ

-1

Ну, когда вы делаете

char *ptr = 'A'; 

Вы эффективны только делаете

char *ptr = 65; 

Однако я не понимаю, что вы имели в виду под «адресом, созданным строкой».

Чтобы получить более высокие значения, вы можете использовать номер:

char *ptr = 13213; 

(Не знаю, почему вы хотели бы сделать это, хотя)

+0

Я имел в виду, что адрес ptr указывает на, является значением определенной строки. Я только что узнал, как (это действительно просто, я не знаю, почему я об этом не думал раньше): char * ptr = (int) ("hello"); – user3604597

+0

Я абсолютно не понимаю, что вы пытаетесь сделать. Это что-то сделает, но ПОЧЕМУ ВЫ ХОТИТЕ ЭТО ??? – MightyPork

+0

Мне это действительно не нужно, на самом деле это не работает, я просто пытаюсь увидеть ... @Mat - если бы я сделал char * ptr = "hello", он бы создал строку " hello ", и ptr укажет на это. В моем случае, я хочу, чтобы адрес ptr имел, будет значением int строки (например, я сделал значение int char). – user3604597

-1

Эквивалент char *ptr = 'A' с тем, что вы называете строку будет походить char *ptr = 'ABCD'. Значение целочисленной символьной константы, содержащей более одного символа, определяется реализацией.

char *ptr = (int)("hello") является не то, что вы ищете, так как значение, присвоенное ptr, скорее всего, так же, как с char *ptr = "hello". Скорее char *ptr = *(int *)"hello" - это то, что вы хотите.

+0

'char * ptr = * (int *)« hello »' не компилируется для меня. – Wolf

+0

Ни одно из этих предложений не работает должным образом. – Wolf

+0

Неудивительно, поскольку согласно ISO/IEC 9899 _A, соответствующая реализация должна выдавать хотя бы одно диагностическое сообщение ... если ... единица перевода содержит нарушение любого синтаксического правила или ограничения_, и эта инициализация нарушает ограничения для назначения. Очевидно, что ОП использует несоответствующую реализацию. – Armali

0

Если вы действительно хотите установить значение ptr для битов данных, которые представляет строковый литерал (с использованием четырех 4 символов на 4 байта на 32 машины), чем это то, что вы должны написать:

char *ptr = *((char**)"abcd"); 

КСТАТИ: Тип указателя абсолютно не имеет значения для «трюк»

int *ptr2 = *(int**)"abcd"; 

Краткое объяснение: Строковые литералы как "abcd" синтаксически рассматриваются как char указатели (или const char указатели). Содержимое указателя может быть разыменовано оператором *. Вам нужно убедить компилятор разыменовать 32-битный объект, а указатель - такой 32-разрядный объект в 32-разрядной модели памяти. Даже 32-битное значение может быть использовано для получения шаблона, представленного строковой литературой из 4-ASCII-символов, вам нужно всего лишь заставить компилятор обрабатывать литерал как int (на 32-разрядной машине с операндом) , это также выглядит намного чище:

int s2i = *(int*)"ABCD"; // 0x64636261 on a Little Endian architecture 

...и есть еще один трюк, который, похоже, является некоторыми компиляторами:

int c2i = ((int)'ABCD'); // 0x61626364 on a Little Endian architecture 
Смежные вопросы