赋值从指针生成整数而不进行强制转换

时间:2013-11-26 18:49:35

标签: c struct

#include<stdio.h>
#include<stdlib.h>

typedef struct{

    int number;
    int value;
    int suit;

} CardT;

CardT initCard(CardT, int);
int compareCard(CardT, CardT);
void displayCard(CardT);

int main(void){
    CardT cardB;
    printf("hey man\n");
    initCard(cardB, 32);
    printf("%i\n", &cardB.number);
    printf("%i\n", &cardB.value);
    printf("%i\n", &cardB.suit);
    return(0);
}

CardT initCard(CardT Card, int x){
    Card.number = x;

    if (x%13 == 8){ Card.value = 'T';}
    else if (x%13 == 9){ Card.value = 'J';}
    else if (x%13 == 10){ Card.value = 'Q';}
    else if (x%13 == 11){ Card.value = "K";}
    else if (x%13 == 12){ Card.value = "A";}
    else {Card.value = x%13;}

    Card.suit = x/4;
    return Card;
}

所以事情编译,但输出是数字的内存位置。我无法弄清楚如何在没有错误的情况下输出实际数字。有线索吗?

3 个答案:

答案 0 :(得分:2)

你的指针似乎很困惑。当您在CardT中声明main()时,这不是指针......因此您无需取消引用printf()中的任何内容(如果这是您要尝试的内容) ......如果是这样的话,无论如何都不是正确的方法)。而不是:

printf("%i\n", &cardB.number);

你只需要:

printf("%i\n", cardB.number);

......但这不是唯一的问题。如果你这样做(对于所有三个),你将打印结构成员的值而不是地址,但是由于另一个问题它们将被取消初始化 - 你的initCard()函数正在运行<你传递它的结构的em> copy (通过值传递)并且不在main()中修改结构的内容。您需要将指针传递给它,并在内部使用->运算符而不是.(通过指针而不是直接取消引用和访问结构成员)。所以:

CardT initCard(CardT Card, int x){

变为:

CardT initCard(CardT *Card, int x){

...函数内部的行改为例如:

    Card.number = x;

...为:

    Card->number = x;

答案 1 :(得分:1)

问题在于您使用printf函数的方式。您将参数作为参数传递,而不是实际变量(在变量表示其地址之前)。这是scanf所必需的,因为它必须将数据放在内存位置,但不能放在printf中。所以,你的陈述应该是:

   printf("%i\n", cardB.number);
   printf("%i\n", cardB.value);
   printf("%i\n", cardB.suit);

答案 2 :(得分:0)

scanf()(由于__赋值)需要每个变量的地址不同,printf()需要按值传递变量。你通过地址传递它们是造成这个问题的原因。