Mylące wskazówki w C

Mam więcej niż jedną wątpliwość, więc proszę o cierpliwość. Czy ktoś może mi powiedzieć, dlaczego ten kod zawodzi?

#include<stdio.h>
void main(int argc,char **argv) /*assume program called with arguments aaa bbb ccc*/
{
    char **list={"aaa","bbb","ccc"};

    printf("%s",argv[1]);/*prints aaa*/
    printf("%s",list[1]); /*fails*/ 
}

Zakładałem, że ma to coś wspólnego ze wskaźnikiem do rzeczy wskaźnikowych, których nie rozumiem wyraźnie. Więc spróbowałem:

#include<stdio.h>
void main()
{
char **list={"aaa","bbb","ccc"};
char *ptr;
ptr=list;
printf("%s",ptr);/*this prints the first string aaa*/
    /* My second question is how do i increment the value
       of ptr so that it points to the second string bbb*/
}

Jaka jest różnica pomiędzychar *list[] ichar **list iw jakich sytuacjach oba są idealne do użycia? Jeszcze jedna rzecz, która mnie myli, że jest wyjątkowa? kiedy przechodzęchar **list do innej funkcji, zakładając, że pozwoliłoby mi to uzyskać dostęp do zawartości w sposób, w jaki mogłemargv, to także zawiodło.

Zdaję sobie sprawę, że podobne pytania zostały zadane w przeszłości, ale nie mogę znaleźć tego, czego potrzebuję. jeśli tak, czy ktoś może zamieścić odpowiednie linki.

questionAnswers(5)

yourAnswerToTheQuestion