关于函数的引用和值拷贝
先从例子说起 15:48:56
关于函数引用的例子
1 #include<stdio.h>
2
3 struct HString
4 {
5 char *ch; // 若是非空串,则按串长分配存储区,否则ch为NULL
6 int length; // 串长度
7 };
8
9 void StrPrint(HString T) // 输出T字符串
10 {
11 int i;
12 for(i=0;i<T.length;i++)
13 printf("%c",T.ch[i]);
14 printf("\n");
15 }
16
17
18 void InitString(HString &T)
19 { // 初始化(产生空串)字符串T。
20 T.length=5;
21 T.ch="hhhhh";
22 }
23
24 void main()
25 {
26 HString T;
27 T.ch = "asdf";
28 T.length = 4;
29 InitString(T);
30 StrPrint(T);
31 }
1、上边的例子中在代码的第18行中HString & T,此处加取地址符表示对 函数的引用。此时系统不会分配地址空间,只是在原来字符串的T引用了另一个名字,构成同一个内存区域有了两个名称,此时引用中改变内存区域中的值,输出内存区域的值会改变。输出结果会如下,会是初始化后的字符串值:
运行结果会输出: hhhhh
Press any key to continue_
关于函数的值拷贝的例子
1
2 #include<stdio.h>
3 struct HString
4 {
5 char *ch; // 若是非空串,则按串长分配存储区,否则ch为NULL
6 int length; // 串长度
7 };
8
9 void StrPrint(HString T) // 输出T字符串
10 {
11 int i;
12 for(i=0;i<T.length;i++)
13 printf("%c",T.ch[i]);
14 printf("\n");
15 }
16
17 void InitString(HString T)//初始化产生串T
18 {
19 T.length=5;
20 T.ch="hhhhh";
21 }
22
23 void main()
24 {
25 HString T;
26 T.ch = "asdf";
27 T.length = 4;
28 InitString(T);
29 StrPrint(T);
30 }
2、上述例子中参看函数的值拷贝,与上边函数引用例子所不同的是第17行代码处HString T,此处是值拷贝。通过void Initstring(HString T)函数后,会在内存中重新分配一段内存空间来存储这段字符串
”hhhhh"。在运行主函数时,运行完28行此函数时,字符串会分配在系统分配的内存中,相当于一个副本,函数运行完时,系统为这个函数分配的内存会收回,这段字符串"hhhhh",可能就不存在了,因此原来分配内存空间中的T字符串"asdf"就不会改变。所以系统中输出字符串的T结果是如下:
运行结果会输出: asdf
Press any key to continue_
浙公网安备 33010602011771号