char** argv

0

Witam, przyznaję szczerze, że nie rozumiem pewnej rzeczy i będę bardzo wdzięczny za wytłumaczenie. Chodzi o dostęp do argumentów przekazywanych do programu.
Patrząc w internet robi się to takim sposobem:

#include <stdio.h>
int main( int argc, char ** argv ) {
    printf( "argc = %d\n", argc );
    for( int i = 0; i < argc; ++i ) {
        printf( "argv[ %d ] = %s\n", i, argv[ i ] ); //Dostęp jak do jednowymiarowej tablicy, dlaczego ?
    }
}

Tutaj robie w zasadzie to samo tyle, że definiuje wskażnik na wskażnik do inta. Dlaczego dostęp do danych odbywa się w inny sposób niż do argumentów przekazywanych do programu ?
W pierwszym przypadku mam char** a w drugim```
int**

```c
int main(int argc, char *argv[])
{
    int** x;

    x = malloc(4 * sizeof(int*));
    for (int i = 0; i < 4; i++) {
      x[i] = malloc(4 * sizeof(int));
    }
    for(int i = 0; i < 4; i++)
    {
        for(int j =0; j < 4; j++)
        {
            x[i][j] = 47;
        }
    }
    printf("value=%d",x[0][0]); // OK
printf("value=%d",x[0]); // NOK
    return 0;
}
1

W pierwszym przypadku masz dostęp do tablicy wskaźników, alementem jest wskaźnik na ciąg znakowy, który wyświetlasz... możesz sobie wyświetlić

for( int i = 0; i < argc; ++i ) 
{
    for(int j = 0; argv[i][j]; ++j) 
        printf( "argv[ %d ][x] = %c", i, argv[ i ][j] );
 printf("\n");
}
bedzie to to samo, ale bedziesz mial wyswietlone tak jak chcesz z wykorzystaniem dwuelementowej tablicy
2

W piewszym przypadku dobierasz sie do jednowymiarowej tablicy charow, czyli po prostu do napisu, bo tak dzialaja c-style stringi. Są to tablicę charow zakonczone znakiem \0. w printfie podajesz format %s, wiec bedzie on oczekiwal właśnie wskaźnika na tablicę charow.

W drugim przypadku podajesz %d, wiec printf bedzie oczekiwal zmiennej całkowitej, a x[0] jest wskaźnikiem na zmienną (tu tablicę zmiennych) całkowitych. Dlatego wychodzi lipa.
Printf nie wie co robić ze wskaźnikami na coś innego niz char (upraszczajac)

1 użytkowników online, w tym zalogowanych: 0, gości: 1