一、結(jié)構(gòu)體與函數(shù)參數(shù)
結(jié)構(gòu)體作函數(shù)參數(shù)可分為傳值與傳指針。
1.傳值時結(jié)構(gòu)體參數(shù)會被拷貝一份,在函數(shù)體內(nèi)修改結(jié)構(gòu)體參數(shù)成員的值實際上是修改調(diào)用參數(shù)的一個臨時拷貝的成員的值,這不會影響到調(diào)用參數(shù)。在這種情況下,由于涉及到結(jié)構(gòu)體參數(shù)的拷貝,程序空間及時間效率都會受到影響,所以這種方法基本不用。
例如:
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;
void fun(STUDENT stu)
{
printf(“stu.name=%s,stu.age=%d\n”,stu.name,stu.age);
}
2.傳指針時直接將結(jié)構(gòu)體的首地址傳遞給函數(shù)體,在函數(shù)體中通過指針引用結(jié)構(gòu)體成員,可以對結(jié)構(gòu)體參數(shù)成員的值造成實際影響。這種用法效率高,經(jīng)常采用。
例如:
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;
void fun(STUDENT* pStu)
{
printf(“pStu->name=%s,pStu->age=%d\n”,pStu->name,pStu->age);
}
二、結(jié)構(gòu)體與函數(shù)返回值
對于某些版本的C語言編譯器,返回值僅能為基本數(shù)據(jù)類型如int、char以及指針,因此結(jié)構(gòu)體作為一種組合數(shù)據(jù)類型,不能以值的方式返回,而在有些版本的C編譯器中又可以直接返回結(jié)構(gòu)體變量 ,在C++中也是可以直接返回結(jié)構(gòu)體變量的。
直接返回結(jié)構(gòu)體變量示例如下;
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;
STUDENT fun();
int _tmain(int argc, _TCHAR* argv[])
{
STUDENT p=fun();
printf("p.name=%s",p.name);
return 0;
}
STUDENT fun()
{
STUDENT stu;
stu.age=18;
strcpy(stu.name,"xiaoming");
return stu;
}
以指針方式返回結(jié)構(gòu)體示例如下:
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;
STUDENT* fun()
{
STUDENT* p=malloc(sizeof(STUDENT));
p->age=18;
strcpy(p->name,"xiaoming");
return p;
}