下面是在linux下察看文件大小的代码,比较了C中传地址和传指针的用法,并指出了不同点和使用指针时的注意事项.
传地址:
1 #include <stdio.h>
2 #include <sys/stat.h>
3
4 int main()
5 {
6 char * filename = "/etc/passwd";
7
8 struct stat infobuf1;
9 if (stat("/etc/passwd", &infobuf) == -1)
10 perror(filename);
11 else
12 {
13 printf("The size of %s is %d\n", filename, infobuf.st_size);
14 }
15
16 return 0;
17 }
18
必需使用地址符&,在引用结构体内的元素时使用.运算符.
传指针:
1 #include <stdio.h>
2 #include <sys/stat.h>
3
4 int main()
5 {
6 char * filename = "/etc/passwd";
7
8 struct stat infobuf1;
9 struct stat * infobuf = &infobuf1;
10
11 if(stat(filename, infobuf) == -1)
12 perror(filename);
13 else
14 {
15 printf("The size of %s is %d\n", filename, infobuf->st_size);
16 }
17
18 return 0;
19 }
20
在第9行声明指针后,必需要进行初始化,否则在linux下,被初始化为一个随机的地址,在第11行对其操作时酒会发声错误(在linux下提示"段错误").在第15行,引用结构体内的元素时,使用地址运算符->,或者使用(*infobuf).st_size.
总结:
1、指针引用前必需初始化,初始化最简单的办法就是声明一个同类型的变量,因为变量会被初始化,会被分配内存空间,所以指针就有指的地方了。如:传指针程序段中的第8,9行。
2、理解传地址和传指针的区别。不管怎么说都是要一个地址,譬如在函数stat(char *
filename, struct stat * buf),
对于buf传入时必须是一个地址,不管是指针或是一个变量的地址,归根都是一样的,都是内存中的同一块区域。
3、对于函数声明为stat(char &filename, struct stat &buf)的形式,传入时就不能是地址或者指针,而必需是变量了。