[C] Puntatori
Ciao a tutti, ho un dubbio su questo codice e in generale faccio confusione sui puntatori..
Strtok è una funzione che restituisce un puntatore e infatti *tokenPtr è un puntatore.
Quando però lo uso all'interno del ciclo while, in quel caso tokenPtr, per come è scritto, indica un indirizzo?
Dal poco che ho capito sui puntatori dovrebbe appunto essere un indirizzo, perchè il valore di una variabile puntatore è l'indirizzo dell'elemento a cui punta, però questo non mi torna, nel momento in cui tokenPtr è usato in printf e vengono stampate delle parole, non degli indirizzi...
Grazie in anticipo!
Strtok è una funzione che restituisce un puntatore e infatti *tokenPtr è un puntatore.
Quando però lo uso all'interno del ciclo while, in quel caso tokenPtr, per come è scritto, indica un indirizzo?
Dal poco che ho capito sui puntatori dovrebbe appunto essere un indirizzo, perchè il valore di una variabile puntatore è l'indirizzo dell'elemento a cui punta, però questo non mi torna, nel momento in cui tokenPtr è usato in printf e vengono stampate delle parole, non degli indirizzi...
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[] = "This is a sentence with 7 tokens";
printf("%s\n%s\n\n%s\n",
"The string to be tokenized is:", string,
"The tokens are:");
char *tokenPtr = strtok(string, " ");
while (tokenPtr != NULL) {
printf("%s\n", tokenPtr);
tokenPtr = strtok(NULL, " "); // get next token
}
}
Grazie in anticipo!
Risposte
Ciao, ma il problema è strtok() o il funzionamento di printf() in relazione alle stringhe?
Relativamente a quest'ultimo caso, va detto che il comportamento della funzione printf() varia a seconda dello specificatore di formato. Considerando un puntatore di tipo [inline]char[/inline]:
- se utilizzi lo specificatore [inline]%p[/inline], andrai a stampare l'indirizzo contenuto nel puntatore;
- se utilizzi lo specificatore [inline]%s[/inline], la funzione andrà a considerare e stamperà la stringa che parte dalla locazione di memoria contenuta nel puntatore.
Per esempio:
In pratica
equivale a qualcosa del genere
Relativamente a quest'ultimo caso, va detto che il comportamento della funzione printf() varia a seconda dello specificatore di formato. Considerando un puntatore di tipo [inline]char[/inline]:
- se utilizzi lo specificatore [inline]%p[/inline], andrai a stampare l'indirizzo contenuto nel puntatore;
- se utilizzi lo specificatore [inline]%s[/inline], la funzione andrà a considerare e stamperà la stringa che parte dalla locazione di memoria contenuta nel puntatore.
Per esempio:
#include <stdio.h>
int main()
{
char *ptr = "uno due e tre!";
printf("INDIRIZZO DI MEMORIA: %p\n", ptr);
printf("CONTENUTO STRINGA: %s\n", ptr);
return 0;
}In pratica
printf("%s", ptr);equivale a qualcosa del genere
for(char *p = ptr; *p != '\0'; ++p)
{
printf("%c", *p);
}
Sì il problema effettivamente era in printf, non avevo fatto caso agli specificatori e quindi non capivo perchè stampasse una cosa piuttosto che un'altra.
Ora è tutto chiaro, grazie mille!!!
Ora è tutto chiaro, grazie mille!!!