2013-06-06 17 views
8

Załóżmy Mam następujący kod w moim programie C:printf() drukuje cały szereg

#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); 
} 

Dlaczego wyjście byłoby to całe słowo „hello” zamiast pojedynczego znaku „H "?

Rozumiem jednak, że jeśli wstawię "%c" do formatyzatora, wydrukuje on tylko jedną literę. Ale wciąż adres pamięci dla każdej litery w tym adresie jest inny. Proszę, wytłumacz mi to?

+1

[Dlaczego nie muszę wyłuskać wskaźnika znaku w C przed wydrukowaniem?] (Http://stackoverflow.com/questions/15841696/why-dont-i-need-to-dereference-a-character-pointer-in-c-before-printing-it/15841740#15841740) –

+0

uwaga: '% c' doesn ' t potrzebujesz adresu do wydrukowania, gdzie jako '% s' trzeba podróżować aż do' \ 0' jak @Rohan wyjaśnił w odpowiedzi. –

+0

@SuvP 'printf()' z '% c' need ** wartość ** zmienna, jest dość oczywiste/logiczne, że nie powinno wymagać adresu do wartości dostępowej dla ** pojedynczego ** elementu (można przekazywać według wartości) . Gdzie mam wydrukować ciąg, potrzebuję adresu, aby podróżować, dopóki '\ 0' nie spotka się z tym samym Rohan wyjaśnionym w jego odpowiedzi. Dodatkowo do przechowywania w pamięci scanf potrzebuje adresu nawet z '% c' –

Odpowiedz

24

Ale nadal adres pamięci dla każdej litery w tym adresie jest inny.

adres pamięci jest inna, ale jako tablicę znaków są sekwencyjne. Gdy podasz adres pierwszego elementu i użyjesz %s, printf wydrukuje wszystkie znaki zaczynające się od podanego adresu, dopóki nie znajdzie '\0'.

4

Incase z arrays, adres bazowy (tj. Adres tablicy) jest adresem pierwszego elementu w tablicy. Również nazwa tablicy działa jak wskaźnik.

Rozważ rząd domów (każdy jest elementem w tablicy). Aby zidentyfikować wiersz, potrzebujesz tylko pierwszego adresu domu. Wiesz, że każdy dom ma następną (sekwencyjną). Podanie adresu pierwszego domu, również poda adres rzędu.

Incase napisowych (tablic znaków zdefiniowany w deklaracji), są one automatycznie dołączane przez \0.

drukuje przy użyciu specyfikatora formatu i podanego adresu. Ponieważ używasz %s , drukuje z pierwszego adresu (zwiększając wskaźnik używając arytmetyki) aż do "\ 0"

+0

Witam, proszę wyjaśnij, że wszyscy możemy się uczyć. –

+0

Wygląda na to, że nieprawidłowo kliknąłem podczas przewijania, kiedy przeglądałem ten wpis wczoraj; Właśnie się dowiedziałem, patrząc na mój profil. Niestety nie pozwolę sobie na odwrócenie błędu bez edycji, ponieważ mój głos jest zablokowany. – Asura