鱼C论坛

 找回密码
 立即注册
查看: 7122|回复: 15

有关C语言结构体的问题

[复制链接]
发表于 2013-8-27 17:14:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

struct card
{
        char * face;
        char * suit;
};

int main( void )
{
        struct card aCard;
        struct card * cardPtr;

        aCard.face = "Ace";
        aCard.suit = "Spades";

        cardPtr = &aCard;

        printf( "%s%s%s\n%s%s%s\n%s%s%s\n", aCard.face, " of ", aCard.suit,
                cardPtr->face, " of ", cardPtr->suit,
                ( *cardPtr ).face, " of ", ( *cardPtr ).suit );

        return 0;
}

定义结构体的时候里面的变量为什么要char *类型,我改成char类型编译没错,但运行之后就崩溃了,求高手解答,谢谢。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-27 17:38:21 | 显示全部楼层
【 char * 】 是指针类型(这个指针要指向一个字符串,本身是一个地址)
  【char  】 是字符类型
若是这样
struct card
{
        char  face;
        char  suit;
};

aCard.face = "Ace";
  aCard.suit = "Spades";

这样强行编译可能不会报错,但一定会报类型不匹配的警告的、、
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-27 17:41:34 | 显示全部楼层
O(∩_∩)O~ 至少 char 是%c 你是 %s啊 这是最简单的说法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-27 17:53:30 | 显示全部楼层

但是face和suit是char *变量,把"Ace""Spades"赋给它们不会类型不一致么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-27 17:54:01 | 显示全部楼层
牡丹花下死做鬼 发表于 2013-8-27 17:41
O(∩_∩)O~ 至少 char 是%c 你是 %s啊 这是最简单的说法

这不是我想问的重点。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-27 17:58:57 | 显示全部楼层
本帖最后由 风扫地 于 2013-8-27 18:07 编辑

“sfejgjegh” 类似这种字符串有两种用法。。

一种是这样。初始化的时候复制给字符数组,
char str[10] = "Hello"; // “hello” 在内存中有一块固定的地址 这样初始化是将“Hello"全部拷贝到数组str中去。。

另外一种是这样
char *pstr = NULL ;

pstr = “Hello”; // 这里的"Hello" 在内存中也有固定的区域存放。。这样赋值的意义是将“hello”的首地址(也就是 H的地址)赋值给pstr这个字符指针变量

-----
这两种用法都是合法的。。

举个例子:
你在网上可以查到printf的原型为
int printf(const char *format,...);

他的第一个参数就是(char *)指针类型

所以以下的代码都是合法的。。

代码1:printf("Hello");
代码2:
      char str[10] = "Hello";
     printf(str);
代码3:
    char * pstr  = "Hello";  //
   printf(pstr);
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-27 18:06:13 | 显示全部楼层
风扫地 发表于 2013-8-27 17:58
“sfejgjegh” 类似这种字符串有两种用法。。

一种是这样。初始化的时候复制给字符数组,

是不是可以理解为是一种语法规定?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-27 18:07:17 | 显示全部楼层
本帖最后由 风扫地 于 2013-8-27 18:16 编辑

说了上面的例子,不清楚是否明白鸟:

我再写个代码,不运行的情况下看看你能不能回答出打印出来的答案应该是多少

  1. printf((char *)(&("Hello World! \n")[6]));
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-27 18:38:27 | 显示全部楼层
风扫地 发表于 2013-8-27 18:07
说了上面的例子,不清楚是否明白鸟:

我再写个代码,不运行的情况下看看你能不能回答出打印出来的答案应该 ...

不好意思,刚去搓晚饭了。。。  不确定是不是Hello加一个空格
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-27 19:22:57 | 显示全部楼层
本帖最后由 风扫地 于 2013-8-27 19:24 编辑
yuqiuwangzi 发表于 2013-8-27 18:38
不好意思,刚去搓晚饭了。。。  不确定是不是Hello加一个空格

错了。正确答案可以自己编译着运行,先想想看。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-27 20:37:25 | 显示全部楼层
风扫地 发表于 2013-8-27 19:22
错了。正确答案可以自己编译着运行,先想想看。。

VC++6.0编译运行后崩溃,VS2010编译运行后是World!  不过还是想不明白。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-27 20:51:11 | 显示全部楼层
#include <stdio.h>

struct card
{
        char  *face;
        char  *suit;
};

int main( void )
{
        struct card aCard;
        struct card  cardPtr;

        aCard.face = "Ace";
        aCard.suit = "Spades";

        cardPtr = aCard;

        printf( "%s%s%s\n%s%s%s\n%s%s%s\n", aCard.face, " of ", aCard.suit,
                cardPtr.face, " of ", cardPtr.suit,
                cardPtr.face, " of ", cardPtr.suit );

}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-27 20:52:02 | 显示全部楼层
这样运行就OK了,没有错误,前面的char *face是定义字符串的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-27 21:24:31 | 显示全部楼层
风扫地 发表于 2013-8-27 18:07
说了上面的例子,不清楚是否明白鸟:

我再写个代码,不运行的情况下看看你能不能回答出打印出来的答案应该 ...

【6】是指前六个字符不输出么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-27 21:33:07 | 显示全部楼层
chenjian1985 发表于 2013-8-27 20:52
这样运行就OK了,没有错误,前面的char *face是定义字符串的

这么解释倒是容易多了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-28 20:06:13 | 显示全部楼层
额。。
"aaaaaaaaa"
这样的字符串,直接返回的是个地址,指针变量存放地址,这个是理所应当的
char* tmp_buf = "aaaaaaa";
而你用char去定义tmp_buf,只是一个字符变量,所以肯定不对。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-5 20:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表