免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8075 | 回复: 10
打印 上一主题 下一主题

结构体中数组成员赋值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-18 18:17 |只看该作者 |倒序浏览
现有一个问题想高手请教,见程序

struct student {
        int num;
        char name[15];
};

struct student Zhangsan;
memset (&Zhangsan, 0, sizeof(Zhangsan));

//现要给结构体Zhangsan赋值, 学号为7, 姓名为Zhangsan
Zhangsan.num = 7;
strcpy(Zhangsan.name, "Zhangsan");    /*想请问高手,1.为什么要这样? 2. strcpy()的两个参数都是字符指针,这样为什么不报错?*/


char *strcpy(char *dst, const char *src)
{
         char *cp = dst;

         while(*cp++ = *src++)
                     ;

         return dst;
}

论坛徽章:
0
2 [报告]
发表于 2007-12-18 18:33 |只看该作者

回复 #1 hufubin 的帖子

Zhangsan.name大概等同于&Zhangsan.name[0] 所以说是对的

论坛徽章:
0
3 [报告]
发表于 2007-12-18 18:44 |只看该作者
那请问这么使用strcpy()函数对吗?  函数原型说明时定义的参数可是两个字符指针,可以直接使用字符串吗?

论坛徽章:
0
4 [报告]
发表于 2007-12-18 18:46 |只看该作者

回复 #3 hufubin 的帖子

这样用是对的。直接用字符串也是对的,系统处理为静态指针

论坛徽章:
0
5 [报告]
发表于 2007-12-18 18:57 |只看该作者
[quote]原帖由 [i]hufubin[/i] 于 2007-12-18 18:44 发表 [url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6437110&ptid=917084][img]http://linux.chinaunix.net/bbs/images/common/back.gif[/img][/url]
那请问这么使用strcpy()函数对吗?  函数原型说明时定义的参数可是两个字符指针,可以直接使用字符串吗? [/quote]

不但这样是正确的, 连下面这样都是正确的!


        printf("%c\n", 2["abcde"]);
        printf("%c\n", "abcde"[4]);

论坛徽章:
0
6 [报告]
发表于 2007-12-18 19:21 |只看该作者
呵呵,开门见山的说:Zhangsan.name 和 "Zhangsan"的类型都是 char *!

现在给你一一解释。

1.Zhangsan.name

char name[15]做了这样一件事:他在进程的堆栈空间里分配了15个连续的char类型空间,并让指针name指向这段空间的第一个位置。既然name指向第一个位置,它当然是char *类型了。
在C语言里,数组和指针是不分家的。建议楼主认真阅读《The C Programming Language:第五章 指针与数组》(PS:你看看,Kernighan和Ritchie把指针和数组都归在一章里了,可见它俩之间的关系有多紧密。)

2."Zhangsan"

这个比较复杂,容我细细道来。
"Zhangsan"是字符串,不错!但是它不是一般的字符串,它是字符串常量。所谓常量,就是在编译阶段就可以确定其值,并不会改变其值那一类变量。
一段C程序被编译成机器码以后,当它执行的时候,内存是这样分配的:

如图:代码区就是C代码被编译以后的机器代码;
栈区用来分配函数内的自动变量;
堆区用来分配全局的可变变量(注意!“可变变量”这个词是我自造的,其实可变变量就是一些全局的空间,这些空间的内容是可以被改变的。)。
那么,静态数据区是干什么的呢?答:它用来存放那些内容不可改变的变量的(说白了,这些变量就是常量!)。
所以呢,针对下面代码代码,变量分配是这样的:
int
main(int argc , char *argv[])
{
    struct student Zhangsan;
    memset (&Zhangsan, 0, sizeof(Zhangsan));
    Zhangsan.num = 7;
    strcpy(Zhangsan.name, "Zhangsan");  
    return 0;
}


堆区:Zhangsan
栈区:argc,argv

静态数据区:"Zhangsan"

so,"Zhangsan"字符串是无名的。"Zhangsan"自己就是自己的名字——它的类型就是char*.

呵呵,说的有点悬乎!

总结一句:字符串常量的值就是该字符串常量的首字符地址!
强调一句:字符串常量的在静态数据区,其内容是不能被改变的!(strcpy( "Zhangsan",string)是个严重的错误哦!)

~完~

评分

参与人数 2可用积分 +18 收起 理由
sakulagi + 9 精品文章
MMMIX + 9 精品文章

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2007-12-18 19:28 |只看该作者

回复 #6 jediii 的帖子

不错, 不过如果能将那幅图再标上一个高地址, 低地址就更好了! 因为平时我们一般都是将低地址画在下面的!

论坛徽章:
0
8 [报告]
发表于 2007-12-18 19:36 |只看该作者

回复 #7 scutan 的帖子

悄悄告诉你:
高低我也分不清····

论坛徽章:
0
9 [报告]
发表于 2007-12-18 19:43 |只看该作者

回复 #6 jediii 的帖子

厉害!  受益匪浅! 多谢大虾

论坛徽章:
0
10 [报告]
发表于 2007-12-19 08:13 |只看该作者
非常受教,谢各位大侠指教.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP