2016-08-14 2 views
-2

Мой учебник имеет вопрос, который спрашивает, что будет на выходе будет в следующем фрагменте кода:Почему это вывод указателя?

#include<stdio.h> 

int main() 
{ 
    int arr[3] = {2, 3, 4}; 
    char *p; 
    p = arr; 
    p = (char*)((int*)(p)); 
    printf("%d, ", *p); 
    p = (int*)(p+1); 
    printf("%d", *p); 
    return 0; 
} 

Параметры:

A. 2, 3

B. 2, 0

С. 2, мусоропровода значение

Д. 0, 0

Согласно учебнику, ответ B, но я смущен - может кто-нибудь объяснить почему?

+0

Итак, что не так? Чего ты ожидал? Что вы сами пытались ответить? Что вы любите в книге C? Что конкретно ** об этом вы не понимаете? Вы пробовали ** что-нибудь **, прежде чем спрашивать? – Olaf

+0

С таким типом вопросов может быть очень сложно определить, что именно никто не понимает, и еще труднее выяснить, какие ключевые слова искать. Изучение всего языка C, очевидно, по-прежнему будет отвечать на их вопрос, но кажется, что это не пропорционально. * Что вы должны сделать, по вашему мнению? –

ответ

0

Предупреждение: Некоторые из них довольно упрощены.

Речь идет о макете памяти. При определении arr, это массив int и выглядит в памяти:

2, 3, 4

Но каждый int является (или, скорее, может быть, C является своего рода зависит от платформы .) четыре char s long. Таким образом, если рассматривать как массив char это выглядит следующим образом:

2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0

Как p имеет тип char *, добавляя один к p, продвигая указатель на один, как во второй перспективе. Поэтому вы получаете этот результат.

+0

Нет, речь идет о вызове неопределенного поведения. – Olaf

+0

1) Разве вы не просто прокомментировали тот факт, что вы, похоже, не знаете, о чем именно речь? 2) Просьба уточнить. Какое неопределенное поведение вы ссылаетесь? –

+0

1) Почему это может изменить проблему? Btw. Я не прокомментировал, что вопрос неясен, но просто неясно, о чем конкретно говорит OP ** **. Вы можете просмотреть правила для вопросов. Приближаясь к этому другому «Я слишком ленив, чтобы пойти на рыбалку, дай мне рыбу». 2) Ну, это ** ваш ** ответ, как насчет того, чтобы узнать себя? – Olaf

Смежные вопросы