Я играю с различными примерами указателей и имею довольно простой вопрос.

Не обращайте внимания на то, как манипулируют вещами, и это всего лишь различные способы получить лучшее понимание.

Вопрос относится к выводу следующего кода.

#include <stdio.h>
#include <stdlib.h>

void sampleForPosting();

int main(int argc, char** argv)
{
    int size = 5;
    char* strVar;
    strVar = (char*)malloc(sizeof(char) * size);

    int* intVar;
    intVar = (int*)malloc(sizeof(int) * size);

    *(strVar + 0) = '1';
    *(strVar + 1) = '2';
    *(strVar + 2) = '3';
    *(strVar + 3) = '4';
    *(strVar + 4) = '\0';

    *(intVar + 0) = 1;
    *(intVar + 1) = 2;
    *(intVar + 2) = 3;
    *(intVar + 3) = 4;

    printf("\n");
    printf("strVar        : %s\n", strVar); /// %s means to print out until \0 is reached

    printf("\n");
    printf("intVar        : %d\n", intVar);

}

Вывод

strVar        : 1234
intVar        : 13193920

Вопросы.

При распечатке содержимого указателя строки он печатает фактическую строку. При распечатке содержимого указателя int он печатает адрес, на котором находится номер.

Почему разное поведение? Поведение диктуется аргументами printf% s или% n?

0
Unhandled Exception 27 Апр 2020 в 17:08

2 ответа

Лучший ответ

%s печатает строку, чтобы напечатать строку, вы должны передать адрес первого символа, и он читает до \0, как вы сказали.

%d печатает целое число, для печати целого числа вам нужно передать целое число, но вы передаете указатель в качестве параметра.

Поскольку intVar является указателем, он печатает адрес. Если вы хотите напечатать номер, вы должны использовать *intVar или *(intVar + x).

printf("intVar        : %d\n", *intVar);

См. printf man:

Строка формата состоит из [...] спецификаций преобразования , каждая из которых приводит к получению нуля или более последующих аргументов. Каждая спецификация конверсии вводится символом % и заканчивается спецификатором конверсии .

А для спецификаторов преобразования:

Символ, который указывает тип конверсии , который будет применен. Спецификаторы преобразования и их значения:

d , i . Аргумент int преобразуется в запись десятичного знака со знаком .

s [...] аргумент const char * ожидается указатель на массив символьного типа (указатель на строку)

p Аргумент указателя void * печатается в шестнадцатеричном формате (как будто% # x или% # lx).

1
Mickael B. 27 Апр 2020 в 14:33

Вы пытались скомпилировать свой код:

 warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’

Компиляция показывает предупреждение о типе формата.

Когда вы используете %s, это означает, что вы общаетесь с компилятором: Hey, compiler, help me to print the string.

Когда вы используете %d, это означает, что вы говорите с компиляцией: Hey, compiler, help me to print the integer value. Таким образом, компилятор выведет значение переменной intVar

Если вы хотите напечатать адрес указателя, вы должны использовать %p:

printf("intVar        : %p\n", intVar);
1
Hitokiri 27 Апр 2020 в 14:23