Drukowanie wskaźników w C

Próbowałem zrozumieć coś ze wskaźnikami, więc napisałem ten kod:

#include <stdio.h>

int main(void)
{
    char s[] = "asd";
    char **p = &s;

    printf("The value of s is: %p\n", s);
    printf("The direction of s is: %p\n", &s);

    printf("The value of p is: %p\n", p);
    printf("The direction of p is: %p\n", &p);

    printf("The direction of s[0] is: %p\n", &s[0]);
    printf("The direction of s[1] is: %p\n", &s[1]);
    printf("The direction of s[2] is: %p\n", &s[2]);

    return 0;
}

Podczas kompilacji za pomocą gcc otrzymuję następujące ostrzeżenia:

$ gcc main.c -o main-bin -ansi -pedantic -Wall -lm
main.c: In function ‘main’:
main.c:6: warning: initialization from incompatible pointer type
main.c:9: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘char (*)[4]’
main.c:11: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘char **’
main.c:12: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘char ***’

(Flagi dla gcc są dlatego, że muszę być C89)

Dlaczego niezgodne typy wskaźników? Czy nazwa tablicy nie jest wskaźnikiem do jej pierwszego elementu? Więc jeśli s jest wskaźnikiem do „a”,&s musi byćchar **, nie? I dlaczego otrzymuję inne ostrzeżenia? Czy muszę rzucać wskaźniki z (void *) aby je wydrukować?

A kiedy uruchomię, otrzymam coś takiego:

$ ./main-bin
The value of s is: 0xbfb7c860
The direction of s is: 0xbfb7c860
The value of p is: 0xbfb7c860
The direction of p is: 0xbfb7c85c
The direction of s[0] is: 0xbfb7c860
The direction of s[1] is: 0xbfb7c861
The direction of s[2] is: 0xbfb7c862

Jak wartość s i jej kierunek (i oczywiście wartośćp) być takim samym?

questionAnswers(8)

yourAnswerToTheQuestion