2016-01-02 2 views
3

Я узнаю о указателях, и я запускаю эту программу из учебника, который дает интересный результат.Базовая программа, интересный выход? Объяснение

#include <stdio.h> 

int main() { 

    int var = 20; /*actual variable declaration */ 
    int *ip; /*pointer variable declaration*/ 

    ip = &var; /*store addres of var in ip variable*/ 

    printf("Address of var variable: %x\n", &var); 

    /*address stored in ip variable*/ 
    printf("Address of stored in ip variable: %x\n", ip); 
    /*access the value using pointer */ 
    printf("value of *ip variable: %x\n", *ip); 

    return 0; 

} 

И к моему пониманию, сайт говорит, что мой вывод должен быть две соответствующие ячейки памяти, и значение 20 для «Значение * ф переменной» части. У меня нет проблем с ячейками памяти, они оба выглядят одинаково, как и предполагалось, но последняя часть, сообщившая мне значение переменной * ip, равно 14?

Address of var variable: 6d73b8cc 
Address of stored in ip variable: 6d73b8cc 
value of *ip variable: 14 

Что здесь происходит? Собран с НКУ, который дает одно предупреждение о формате% х ожидает целое число без знака, но аргумент 2 имеет тип ....

MorePointers.c:10:9: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=] 
    printf("Address of var variable: %x\n", &var); 
     ^
MorePointers.c:13:9: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=] 
    printf("Address of stored in ip variable: %x\n", ip); 

Поправьте меня, пожалуйста, если я не прав, но это могло быть связано с формат, который, когда ожидается целое число без знака, может привести к тому, что число будет равно 20? являющееся целым числом без знака, находится в пределах значений от 0 до 65535 или от 0 до 4 294 967 295, тогда как целое число находится в пределах значений -32,768 до 32,767 или -2,147,483,648 до 2,147,483,647?

ответ

10

Происходит то, что вы напечатали целочисленное значение 20 в виде шестнадцатеричного значения, которое по праву отображается как 14. Я подозреваю, что вы ожидали, что 20 десятичной. :)

+0

Я ожидал только десятичной версии, так как thasts, что учебники того же кода, выведенные, что, как говорится, ваш ответ имеет смысл. – Colabambino

4

Вы печатаете шестнадцатеричное значение var или *ip, то есть 0x14.

Использовать %d для десятичного значения.

5

Некоторые исправления: -

printf("Address of var variable: %x\n", &var); 

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

printf("Address of var variable: %p\n", &var); /* << ensure pointer value */ 

При вызове printf, он смешивает фиксированный текст с параметрами в порядке .. .

printf("hello %d world %d today %d\n", 1,2,3); 

Отпечатки привет 1 мир 2 сегодня 3

Способ отображения параметра основан на спецификаторе формата.

%s /* displays as a string */ 
%d /* displays as an integer in normal decimal */ 
%x /* displays an integer in hexa-decimal. */ 
%f /* displays as a floating point */ 
%p /* displays a pointer address */ 

Decimal goes  0,1,2,..,8,9,10,11,...,14,15,16,17,...,20 
Hexadecimal goes 0,1,2,..,8,9, A, B,..., E, F,10,11,...,14 
+0

Благодарим вас за исправления, в то время как они не указали мой код и из учебника, по-прежнему очень полезная информация, приветствия. – Colabambino

2

Первых два printf() заявлений имеет неопределенное поведение, так как %x требует, чтобы соответствующий параметра иметь типа без знака, а не указатель. Отсюда и предупреждения. Посмотрите формат %p, если вы хотите напечатать значение указателей (и конвертировать указатели в (void *), чтобы использовать это).

%x печатает значение в шестнадцатеричном виде, основание 16. Значение 20 (десятичный) в шестнадцатеричном виде равно 14 (1*16 + 4). Строго говоря, вы должны преобразовать int в unsigned, чтобы использовать %x.

1

Печать адресов с помощью printf() должна выполняться с помощью «% p» не «% x».

Если вы собрали со всеми предупреждениями поддержкой (для НКУ, при минимальном использовании: -Wall -Wextra -pedantic) тогда компилятор сказал бы вам, по линии 10 и линии 13:

warning: format: '%x' expects argument of type 'unsigned int', but argument two has type 'int*' [-Wformat=]` 

Последний вызов printf() передает тип 'int', но '% x' ожидает unsigned int.

предложение об объявлении «ф» и «вар» как unsigned int вместо int

или измените последнюю Е() для:

printf("value of *ip variable: %d\n", *ip); 

вы можете read.learn о спецификаторов формата для Е () по адресу:

<http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output> 

или чтение printf человек страницы

+0

Благодарим вас за флагов компилятора! – Colabambino

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