функции printf() выводит весь массив

предположим, у меня есть следующий код в моей программы C:

#include <stdio.h>

void PrintSomeMessage( char *p );

int main(int argc, char *argv[]) {
    char arr[10] = "hello";
    PrintSomeMessage(&arr[0]);
    return 0;   
}

void PrintSomeMessage(char *p)
{
    printf("p: %s",p);
}

почему выход этого будет целым словом " привет "вместо одного символа"h"?

Я понимаю, что если я ставлю "%c" в праматерии, он будет печатать только одну букву. Но все же, адрес памяти для каждой буквы в этом адресе отличается. Пожалуйста, кто-нибудь объяснит мне?

2 ответов


но все же, адрес памяти для каждой буквы в этом адресе отличается.

адрес памяти отличается, но как его массив символов они являются последовательными. Когда вы передаете адрес первого элемента, и использовать %s, printf будет печатать все символы, начиная с заданного адреса, пока не найдет ''.


Incase массивы базовый адрес (т. е. адрес массив) адрес 1-й элемент в массиве. Также имя массива действует как указатель.

рассмотрим ряд домов (каждый из которых является элементом массива). Для идентификации строки, вам нужен только 1-й адрес.Вы знаете, что за каждым домом следует следующий (последовательный).Получив адрес 1-го дома, вы также получите адрес строки.

Incase строки литералы (массивы символов, определенные при объявлении), они автоматически суффикс .

printf печать с помощью спецификатора формата и адресу. Так как вы используете %s он печатает с 1-го адреса (увеличивая указатель с помощью арифметики) до "\0"