Ваша программа вызывает неопределенное поведение. Предполагается, что указатель будет вписываться в int
, что не требуется. Обычно указатели помещаются в Unix-боксы и не работают в Windows; но вы должны использовать подходящий целочисленный тип, например intptr_t
от stdint.h
, если вам нужно сделать такие преобразования. Обратите внимание, что строго говоря, целое число должно быть возвращено к типу указателя перед передачей printf
.
Используя тип указателя на printf
и большие результаты достаточно интегрального типа в правильном поведении: http://ideone.com/HLExMb
#include <stdio.h>
#include <stdint.h>
int main(void)
{
char ar[10][10];
strcpy(ar[1], "asd");
strcpy(ar[2], "fgh");
intptr_t test[2];
test[1] = (intptr_t)ar[1];
printf("%s %x | %s %x\n\n", ar[1], ar[1], (char*)test[1], (char*)test[1]);
return 0;
}
Примечание, однако, что литейные указатели в целочисленных типов, как правило, одобряется и, скорее всего, приведет к программные ошибки. Не ходите туда, если вам абсолютно не нужно делать это по той или иной причине. Когда вы начинаете с C, маловероятно, что вам когда-нибудь понадобится это сделать.
Ваша программа имеет * неопределенное поведение *, что в основном означает, что программа может делать что угодно, включая * работу как ожидалось *. Прочитайте [Неопределенные поведенческие и последовательные точки] (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points) и [Что должен знать каждый программист C о неопределенном поведении] (http: // blog. llvm.org/2011/05/what-every-c-programmer-should-know.html) –
@Blue: Я не вижу, какие точки последовательности должны быть связаны с этим обсуждением; здесь нет неопределенного поведения в результате многократной модификации переменных без промежуточных точек последовательности. –