Ce n'est pas parce que vous avez dit que d'autres réponses me déroutent, voyons d'abord ce qui se passe avec un exemple plus simple.
char *ptr = "somestring";
Ici "somestring"
est un littéral de chaîne de caractères qui est stocké dans section de données en lecture seule de la mémoire. ptr
est un pointeur (alloué comme les autres variables dans la même section de code) qui pointe sur le premier octet de cette mémoire allouée.
Considérez donc ces deux déclarations
char *ptr2 = ptr; //statement 1 OK
ptr[1] = 'a'; //statement 2 error
L'instruction 1 effectue une opération parfaitement valide (affectation d'un pointeur à un autre), mais l'instruction 2 n'est pas une opération valide (tentative d'écriture dans un emplacement en lecture seule).
Par contre, si on écrit :
char ptr[] = "somestring";
Ici, ptr n'est pas réellement un pointeur, mais le nom d'un tableau (contrairement au pointeur, il ne prend pas d'espace supplémentaire dans la mémoire). Il alloue le même nombre d'octets que celui requis par la fonction "somestring"
(pas en lecture seule) et c'est tout.
Considérons donc les deux mêmes déclarations et une déclaration supplémentaire
char *ptr2 = ptr; //statement 1 OK
ptr[1] = 'a'; //statement 2 OK
ptr = "someotherstring" //statement 3 error
L'instruction 1 effectue une opération parfaitement valide (affectation du nom du tableau à un pointeur, le nom du tableau renvoie l'adresse du premier octet), l'instruction 2 est également valide car la mémoire n'est pas en lecture seule.
La déclaration 3 n'est pas une opération valide car ici ptr n'est pas un pointeur, il ne peut pas pointer vers un autre emplacement mémoire.
Maintenant, dans ce code,
char **str={"what","is","this"};
*str
est un pointeur ( str[i]
est identique à *(str+i)
)
mais dans ce code
char str[][] = {"what", "is", "this"};
str[i]
n'est pas un pointeur. C'est le nom d'un tableau.
La même chose que ci-dessus se produit.
5 votes
Peut-être que vous voulez dire
char * str[] = {"what", "is", "this"};
pour le premier ?0 votes
Essayez
char *str[] = {"what","is","this"}; putchar(str[0][0]);
d'abord etchar *str[] = {"what","is","this"}; str[0][0] = 't';
suivant. Tu peux apprendre une autre chose. Voir stackoverflow.com/questions/8795576/ après l'expérience.1 votes
@ajay brahmakshatriya oui
1 votes
La dernière modification a rendu les réponses de ce post erronées. S'il vous plaît ne pas modifier si vous ne comprenez pas la question.
3 votes
@haccks la dernière modification a été faite par l'OP lui-même. Je suis d'accord pour dire que cela invalide certaines réponses, mais la bonne question doit être abordée.
3 votes
@ajay Le PO peut poser une nouvelle question si son édition invalide les réponses.
4 votes
La question initiale (avec
char *str
au lieu dechar *str[]
) n'a même pas de sens, puisque le PO dit "alorsstr[i]="newstring";
est valide alors questr[i][j]='j';
n'est pas valable", qui s'applique àchar *
signifierait que l'attribution d'une valeur de pointeur à un élément char dans une mémoire littérale de chaîne en lecture seule est "valide". Les descriptions de ce qui est "valide" et "invalide" conviennent bien mieux à l'utilisation d'un langage de programmation.char *str[]
ce qui rend la question beaucoup plus pertinente. Il s'agit clairement d'une faute de frappe, comme le confirme le PO.0 votes
@CandyGumdrop Puisque jusqu'à présent ma réponse est fortement votée, je l'ai abordée dans ma réponse.
0 votes
Quel gâchis de prime :-)