[C] Puntatori

Messaggioda sofisofi » 07/04/2022, 11:17

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...

Codice:
#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!
sofisofi
Starting Member
Starting Member
 
Messaggio: 20 di 42
Iscritto il: 03/06/2020, 17:06

Re: [C] Puntatori

Messaggioda utente__medio » 07/04/2022, 12:50

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 char:
- se utilizzi lo specificatore %p, andrai a stampare l'indirizzo contenuto nel puntatore;
- se utilizzi lo specificatore %s, la funzione andrà a considerare e stamperà la stringa che parte dalla locazione di memoria contenuta nel puntatore.

Per esempio:
Codice:
#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

Codice:
printf("%s", ptr);


equivale a qualcosa del genere

Codice:
for(char *p = ptr; *p != '\0'; ++p)
{
    printf("%c", *p);
}
"Ci abbaiano, Sancho; segno che stiamo cavalcando!"
utente__medio
Junior Member
Junior Member
 
Messaggio: 86 di 394
Iscritto il: 02/11/2021, 12:48
Località: Draghistan

Re: [C] Puntatori

Messaggioda sofisofi » 07/04/2022, 13:22

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!!!
sofisofi
Starting Member
Starting Member
 
Messaggio: 21 di 42
Iscritto il: 03/06/2020, 17:06


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite