C - отображение содержимого указателя. Разница между str и int - PullRequest
0 голосов
/ 27 апреля 2020

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

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

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

#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?

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

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

 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 голос
/ 27 апреля 2020

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

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

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

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

См. printf man :

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...