下面是在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)的形式,傳入時就不能是地址或者指針,而必需是變量了。