现有一个问题想高手请教,见程序
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;
}
----------------------------
Zhangsan.name大概等同于&Zhangsan.name[0] 所以说是对的
----------------------------
那请问这么使用strcpy()函数对吗?函数原型说明时定义的参数可是两个字符指针,可以直接使用字符串吗?
----------------------------
这样用是对的。直接用字符串也是对的,系统处理为静态指针
----------------------------
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]);
-----------------------------
呵,开门见山的说: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(intargc,char*argv[])
{
structstudent Zhangsan;
memset(&Zhangsan,0,sizeof(Zhangsan));
Zhangsan.num=7;
strcpy(Zhangsan.name,"Zhangsan");
return0;
}
堆区:Zhangsan
栈区:argc,argv
静态数据区:"Zhangsan"
so,"Zhangsan"字符串是无名的。"Zhangsan"自己就是自己的名字——它的类型就是char*.
呵呵,说的有点悬乎!
总结一句:字符串常量的值就是该字符串常量的首字符地址!
强调一句:字符串常量的在静态数据区,其内容是不能被改变的!(strcpy( "Zhangsan",string)是个严重的错误哦!)
~完~