2017-09-27 3 views
1
#include<stdio.h> 
#include<string.h> 

int main() 
{ 
char arr[3][10]; 
char *ptr[3]; 
strcpy(arr[1],"abcde"); 
ptr[1]=arr[1]; 
printf("%s\n",arr[1]); 
printf("%p\n", &arr[1]); 
printf("%p\n", ptr[1]); 
printf("%p\n", &ptr[1]); 
printf("%s\n",ptr[1]); 
printf("%s\n", *(ptr+1)); 
return 0; 
} 

Résultatdans le tableau de la valeur d'impression pointeur sans *

abcde 
0x7ffdcbbd8daa 
0x7ffdcbbd8daa 
0x7ffc30ed1188 
abcde 
abcde 

Je sais ptr est un tableau de pointeur. Le déréférencement d'un pointeur nécessite un opérateur unaire avant celui-ci. Pourquoi peut-on déréférencer le pointeur ptr[1] sans le *? Merci

+0

Pouvez-vous préciser votre problème et votre question? Voulez-vous dire la ligne (mal typée) 'printf ("% s \ n ") ptr [1]);'? (Dans le futur, *** copier-coller *** code au lieu de le réécrire dans la question.) –

+1

Notez également que 'arr [1]' et '& arr [1]' pourraient pointer vers le même emplacement, mais sématiquement ils sont différents. 'arr [1]' est égal à '& arr [1] [0]' qui est de type 'char *'. '& arr [1]' est de type 'char (*) [10]'. –

+1

Vous n'êtes pas déréférencé, printf() prend un pointeur sur une chaîne pour "% s". Vous donnez un pointeur dans ptr [1]. – MayurK

Répondre

1

%s spécificateur dans printf attend et l'argument de type char * (il doit pointer vers une chaîne terminée par zéro). ptr[1] est du type char *. Donc, pas besoin d'appliquer l'opérateur de déréférencement ici.

0

Vous avez eu tort. Ici:

printf("%s\n", ptr[1]); 
  • Le format %s attend un pointeur vers char.
  • ptr[1] est un pointeur char.

pourquoi j'utiliser * (ptr + 1), il imprime la même valeur?

Parce que ce appliquera Arithmétique de pointeur, qui impliquent ptr, ajouter 1 à ce (par un ici, nous entendons la taille d'un int), puis utilisez l'opérateur * et se référer au contenu de cette adresse mémoire (où il pointe) à, qui est la même valeur que ptr[1].


arr[1] et &arr[1] pourrait pointer vers le même endroit, mais sematically ils sont différents. arr[1] est égal à &arr[1][0] qui est de type char*. &arr[1] est de type char (*)[10], comme Quelque programmeur mec a dit.

+0

alors pourquoi j'utilise * (ptr + 1) il imprime la même valeur –

+0

"vous n'êtes pas déréférencement." -> Avec 'ptr [1]' ressemble à du code _is_ déconnectant 'ptr' au décalage 1. Bien sûr, cela se traduit par un' char * ', qui n'a pas besoin d'une autre opération de référence pour l'impression avec' "% s "'. – chux

+0

Parce que la fin à la même valeur @QuocAnhPham, vérifiez ma réponse mise à jour, espérons que cela aide! BTW, vous avez deux réponses utiles, considérer * accepter * un en cliquant sur le Tick Mark sur la gauche d'une réponse. – gsamaras