DOMANDA C -> Struct E Puntatori

Robert T.

Utente Attivo
134
11
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 Èlite
1,521
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
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

Moderatore
Staff Forum
1,234
866
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
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).
 
  • Like
Reactions: rodhellas

Robert T.

Utente Attivo
134
11
@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 Èlite
1,521
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Concettualmente, la funziona scambia dovrebbe essere void visto che opera con i puntatori e il return non è salvato in nessuna variabile.
 
  • Like
Reactions: DispatchCode

DispatchCode

Moderatore
Staff Forum
1,234
866
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
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).
 
  • Like
Reactions: rodhellas

Entra

oppure Accedi utilizzando

Discussioni Simili

Hot: Sei vaccinato? [sondaggio anonimo]

  • Primo ciclo vaccinale completo (1-2 dosi)

    Voti: 468 78.8%
  • Fatta 1a dose, in attesa della 2a

    Voti: 20 3.4%
  • Sono prenotato per la 1a dose

    Voti: 13 2.2%
  • Non so se vaccinarmi

    Voti: 16 2.7%
  • Non ho intenzione di vacciarmi

    Voti: 61 10.3%
  • Fatta anche la terza dose

    Voti: 16 2.7%