DOMANDA C -> Struct E Puntatori

Robert T.

Utente Attivo
Dato questo codice:

C:
#include <stdio.h>

struct carte{
    int *numero;
    char *faccia;
};

int main() {
    struct carte Carta, *ca;
    ca = &Carta;
    ca->numero = 2;
    ca->faccia = "testo";
    printf("%d %s", ca->numero, ca->faccia);
    return 0;
}
Perchè se levo gli astirischi da struct e li faccio diventare semplici variabili non funziona più il codice, cioè in questa maniera:

Codice:
#include <stdio.h>
ORA:
struct carte{
    int numero;
    char faccia;
};

PRIMA:
struct carte{
    int *numero;
    char *faccia;
};
ecc...
 
Ultima modifica da un moderatore:

rodhellas

Utente Attivo
1,480
398
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
Windows 10 64bit
L'asterisco da numero lo puoi togliere ( da errore se lo lasci ), da faccia no ( "testo" è una stringa, non un char singolo)
 

DispatchCode

Utente Attivo
593
342
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
@Robert T.
Ti ha già risposto rod, tuttavia preciso solo che numero non da errore, ma darà un eccezione (stai assegnando un numero ad un puntatore, quindi dirà un warning avvertendo che "assignment makes pointer to integer without a cast").
L'altro è un puntatore ad una stringa. Ogni carattere è memorizzato ad una locazione differente (contigua) in memoria: se accedi alla stringa faccia[0] otterrai il primo carattere; faccia[1] è il secondo carattere e così via (stesso risultato incrementando il puntatore, essendo un indirizzo (virtuale, in realtà) di memoria).
 
  • Mi piace
Reactions: rodhellas

Robert T.

Utente Attivo
@DispatchCode @rodhellas
Ok grazie mille un'altra domanda giusto per non creare un altro thread ma perchè se avvio questo programma la funziona non da nessun return sul terminale?

C:
#include <stdio.h>

int scambia(int *a, int *b);

int main(){

    int a = 10;
    int b = 20;
    printf("%d - %d\n",a,b);
    scambia(&a,&b);
    return 0;
}

int scambia(int *a, int *b){
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
    return *a,*b;
}
 
Ultima modifica da un moderatore:

rodhellas

Utente Attivo
1,480
398
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
Windows 10 64bit
Concettualmente, la funziona scambia dovrebbe essere void visto che opera con i puntatori e il return non è salvato in nessuna variabile.
 
  • Mi piace
Reactions: DispatchCode

DispatchCode

Utente Attivo
593
342
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
Concordo con rod @Robert T. , almeno in parte, in quanto penso che il valore di ritorno in questo caso sia presente per memorizzare in una variabile - qualora lo si voglia - direttamente il numero appena scambiato (non il puntatore attenzione, ma il valore che è presente all'indirizzo puntato).
Il valore che dovresti ottenere è comunque quello di *b (che appunto in questo caso ignori, non memorizzandolo o stampandolo).
 
  • Mi piace
Reactions: rodhellas

Entra

oppure Accedi utilizzando