c語言 結(jié)構(gòu)體 函數(shù) 參數(shù) 傳遞
成都創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)永和,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
本文中的程序?qū)崿F(xiàn)對(duì)員工信息結(jié)構(gòu)體字段賦值并打印出來的功能。該結(jié)構(gòu)體的定義如下:
// 員工信息結(jié)構(gòu)體 typedef struct { INT8 szEmployeeName[100]; // 員工姓名 UINT16 iEmployeeAge; // 員工年齡 UINT32 iEmployeeNo; // 員工工號(hào) } TEmployeeInfo;
函數(shù)GetEmployeeInfo用來對(duì)員工信息字段進(jìn)行賦值,其聲明如下:
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo);
在主函數(shù)main中,采用兩種參數(shù)傳遞的方法,一種是指針傳遞,另一種是非指針傳遞。
采用指針傳遞時(shí)的程序代碼如下:
/**********************************************************************
*版權(quán)所有 (C)2014, Zhou Zhaoxiong。
*
*文件名稱: TestStruct.c
*文件標(biāo)識(shí):無
*內(nèi)容摘要:用于演示結(jié)構(gòu)體變量的用法
*其它說明:無
*當(dāng)前版本: V1.0
*作 者:
*完成日期: 20170711
*
**********************************************************************/
#include <stdio.h>
#include <string.h>
// 數(shù)據(jù)類型
typedef signed char INT8;
typedef unsigned char UINT16;
typedef unsigned int UINT32;
typedef signed int INT32;
// 員工信息結(jié)構(gòu)體
typedef struct
{
INT8 szEmployeeName[100]; // 員工姓名
UINT16 iEmployeeAge; // 員工年齡
UINT32 iEmployeeNo; // 員工工號(hào)
} TEmployeeInfo;
//函數(shù)聲明
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); //獲取員工信息函數(shù)
INT32 main(void);
/****************************************************************
*功能描述: 主函數(shù)
*輸入?yún)?shù): 無
*輸出參數(shù): 無
* 返回值: 0-執(zhí)行成功 -1-執(zhí)行失敗
* 其他說明: 無
* 修改日期 版本號(hào) 修改人 修改內(nèi)容
* ----------------------------------------------------------------------------------------
* 20140617 V1.0 Zhou Zhaoxiong 創(chuàng)建
****************************************************************/
INT32 main(void)
{
INT32 iRetValue = 0; // 該變量用于表示調(diào)用GetEmployeeInfo函數(shù)返回的值
TEmployeeInfo *ptEmployeeInfo = NULL; // 該變量用于存放員工信息
// 調(diào)用函數(shù)對(duì)員工信息字段賦值, 并打印出來
iRetValue = GetEmployeeInfo(ptEmployeeInfo);
if (iRetValue != 0)
{
printf("exec GetEmployeeInfo failed.\n");
return -1;
}
printf("員工信息為: 姓名: %s年齡: %d工號(hào): %d\n",ptEmployeeInfo->szEmployeeName,ptEmployeeInfo->iEmployeeAge,ptEmployeeInfo->iEmployeeNo);
return 0;
}
/**********************************************************************
* 功能描述:對(duì)員工信息字段賦值
* 輸入?yún)?shù): ptEmployeeInfo: 員工信息結(jié)構(gòu)體
* 輸出參數(shù): ptEmployeeInfo: 員工信息結(jié)構(gòu)體
* 返回值: 0-成功 -1-失敗
* 其它說明:無
* 修改日期 版本號(hào) 修改人 修改內(nèi)容
* --------------------------------------------------------------------------------------
* 20140617 V1.0 Zhou Zhaoxiong 創(chuàng)建
***********************************************************************/
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo)
{
// 先對(duì)輸入的指針參數(shù)進(jìn)行異常判斷
if (ptEmployeeInfo == NULL)
{
printf("Input parameter is NULL.\n");
return -1;
}
strncpy((char *)ptEmployeeInfo->szEmployeeName, "Li Yuanfang", strlen("Li Yuanfang")); // 對(duì)姓名字段賦值
ptEmployeeInfo->iEmployeeAge = 100; // 對(duì)年齡字段賦值
ptEmployeeInfo->iEmployeeNo = 123456; // 對(duì)工號(hào)字段賦值
return 0; // 賦值成功, 返回0
}
程序的運(yùn)行結(jié)果如圖1所示:
圖1 采用指針傳遞時(shí)的程序代碼運(yùn)行結(jié)果
從圖1可以看出,函數(shù)GetEmployeeInfo的入?yún)榭眨荒軐?shí)現(xiàn)賦值的功能。
既然程序打印出指針為空的信息,那么我們先對(duì)傳入的指針進(jìn)行賦值操作是不是就可以了呢?
改進(jìn)后的采用指針傳遞時(shí)的程序代碼如下:
/**********************************************************************
*版權(quán)所有 (C)2014, Zhou Zhaoxiong。
*
*文件名稱: TestStruct.c
*文件標(biāo)識(shí):無
*內(nèi)容摘要:用于演示結(jié)構(gòu)體變量的用法
*其它說明:無
*當(dāng)前版本: V1.0
*作 者:周兆熊
*完成日期: 20140617
*
*修改記錄1://修改歷史記錄,包括修改日期、版本號(hào)、修改人及修改內(nèi)容
*修改日期: 20140617
*版本號(hào): V1.0
*修改人: Zhou Zhaoxiong
*修改內(nèi)容:創(chuàng)建
**********************************************************************/
#include <stdio.h>
#include <string.h>
// 數(shù)據(jù)類型
typedef signed char INT8;
typedef unsigned char UINT16;
typedef unsigned int UINT32;
typedef signed int INT32;
//員工信息結(jié)構(gòu)體
typedef struct
{
INT8 szEmployeeName[100]; // 員工姓名
UINT16 iEmployeeAge; // 員工年齡
UINT32 iEmployeeNo; // 員工工號(hào)
} TEmployeeInfo;
//函數(shù)聲明
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); //獲取員工信息函數(shù)
INT32 main(void);
/****************************************************************
*功能描述: 主函數(shù)
*輸入?yún)?shù): 無
*輸出參數(shù): 無
*返回值: 0-執(zhí)行成功 -1-執(zhí)行失敗
*其他說明: 無
*修改日期 版本號(hào) 修改人 修改內(nèi)容
* --------------------------------------------------------------------------------------------
* 20140617 V1.0 Zhou Zhaoxiong 創(chuàng)建
****************************************************************/
INT32 main(void)
{
INT32 iRetValue = 0; // 該變量用于表示調(diào)用GetEmployeeInfo函數(shù)返回的值
TEmployeeInfo *ptEmployeeInfo = NULL; // 該變量用于存放員工信息
//先對(duì)員工信息字段賦值,防止空指針的存在
strncpy((char *)ptEmployeeInfo->szEmployeeName, "Di Renjie", strlen("Di Renjie")); //對(duì)姓名字段賦值
ptEmployeeInfo->iEmployeeAge = 150; // 對(duì)年齡字段賦值
ptEmployeeInfo->iEmployeeNo = 654321; // 對(duì)工號(hào)字段賦值
// 調(diào)用函數(shù)對(duì)員工信息字段賦值,并打印出來
iRetValue = GetEmployeeInfo(ptEmployeeInfo);
if (iRetValue != 0)
{
printf("exec GetEmployeeInfo failed.\n");
return -1;
}
printf("員工信息為: 姓名: %s年齡: %d工號(hào): %d\n",ptEmployeeInfo->szEmployeeName,ptEmployeeInfo->iEmployeeAge,ptEmployeeInfo->iEmployeeNo);
return 0;
}
/**********************************************************************
*功能描述:對(duì)員工信息字段賦值
*輸入?yún)?shù): ptEmployeeInfo:員工信息結(jié)構(gòu)體
*輸出參數(shù): ptEmployeeInfo:員工信息結(jié)構(gòu)體
*返回值: 0-成功 -1-失敗
*其它說明:無
*修改日期 版本號(hào) 修改人 修改內(nèi)容
* -----------------------------------------------------------------------------------
* 20140617 V1.0 Zhou Zhaoxiong 創(chuàng)建
***********************************************************************/
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo)
{
// 先對(duì)輸入的指針參數(shù)進(jìn)行異常判斷
if (ptEmployeeInfo == NULL)
{
printf("Input parameter is NULL.\n");
return -1;
}
strncpy((char *)ptEmployeeInfo->szEmployeeName, "Li Yuanfang", strlen("Li Yuanfang")); // 對(duì)姓名字段賦值
ptEmployeeInfo->iEmployeeAge = 100; // 對(duì)年齡字段賦值
ptEmployeeInfo->iEmployeeNo = 123456; // 對(duì)工號(hào)字段賦值
return 0; // 賦值成功, 返回0
}
程序的運(yùn)行結(jié)果如圖2所示:
圖2 改進(jìn)后的采用指針傳遞時(shí)的程序代碼運(yùn)行結(jié)果
可見,程序出現(xiàn)了內(nèi)存問題。原因是在傳遞之前,ptEmployeeInfo指針已經(jīng)指向了確定的地址,不能讓同一個(gè)指針同時(shí)指向不同的地址。
既然不能用指針作為參數(shù)進(jìn)行傳遞,那么我們就要考慮另外的方法。
以下代碼采用非指針的傳遞方式:
/**********************************************************************
*版權(quán)所有 (C)2014, Zhou Zhaoxiong。
*
*文件名稱: TestStruct.c
*文件標(biāo)識(shí):無
*內(nèi)容摘要:用于演示結(jié)構(gòu)體變量的用法
*其它說明:無
*當(dāng)前版本: V1.0
*作 者:周兆熊
*完成日期: 20140617
*
*修改記錄1://修改歷史記錄,包括修改日期、版本號(hào)、修改人及修改內(nèi)容
*修改日期: 20140617
*版本號(hào): V1.0
*修改人: Zhou Zhaoxiong
*修改內(nèi)容:創(chuàng)建
**********************************************************************/
#include <stdio.h>
#include <string.h>
// 數(shù)據(jù)類型
typedef signed char INT8;
typedef unsigned char UINT16;
typedef unsigned int UINT32;
typedef signed int INT32;
// 員工信息結(jié)構(gòu)體
typedef struct
{
INT8 szEmployeeName[100]; // 員工姓名
UINT16 iEmployeeAge; // 員工年齡
UINT32 iEmployeeNo; // 員工工號(hào)
} TEmployeeInfo;
//函數(shù)聲明
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); //獲取員工信息函數(shù)
INT32 main(void);
/****************************************************************
*功能描述: 主函數(shù)
*輸入?yún)?shù): 無
*輸出參數(shù): 無
*返回值: 0-執(zhí)行成功 -1-執(zhí)行失敗
*其他說明: 無
*修改日期 版本號(hào) 修改人 修改內(nèi)容
* --------------------------------------------------------------
*20140617 V1.0 Zhou Zhaoxiong 創(chuàng)建
****************************************************************/
INT32 main(void)
{
INT32 iRetValue = 0; // 該變量用于表示調(diào)用GetEmployeeInfo函數(shù)返回的值
TEmployeeInfo tEmployeeInfo = {0}; // 該變量用于存放員工信息
// 調(diào)用函數(shù)對(duì)員工信息字段賦值,并打印出來
iRetValue = GetEmployeeInfo(&tEmployeeInfo);
if (iRetValue != 0)
{
printf("exec GetEmployeeInfo failed.\n");
return -1;
}
printf("員工信息為: 姓名: %s年齡: %d工號(hào): %d\n",tEmployeeInfo.szEmployeeName,tEmployeeInfo.iEmployeeAge,tEmployeeInfo.iEmployeeNo);
return 0;
}
/**********************************************************************
*功能描述:對(duì)員工信息字段賦值
*輸入?yún)?shù): ptEmployeeInfo:員工信息結(jié)構(gòu)體
*輸出參數(shù): ptEmployeeInfo:員工信息結(jié)構(gòu)體
*返回值: 0-成功 -1-失敗
*其它說明:無
* 修改日期 版本號(hào) 修改人 修改內(nèi)容
* --------------------------------------------------------------
* 20140617 V1.0 Zhou Zhaoxiong 創(chuàng)建
***********************************************************************/
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo)
{
// 先對(duì)輸入的指針參數(shù)進(jìn)行異常判斷
if (ptEmployeeInfo == NULL)
{
printf("Input parameter is NULL.\n");
return -1;
}
strncpy((char *)ptEmployeeInfo->szEmployeeName, "Li Yuanfang", strlen("Li Yuanfang")); // 對(duì)姓名字段賦值
ptEmployeeInfo->iEmployeeAge = 100; // 對(duì)年齡字段賦值
ptEmployeeInfo->iEmployeeNo = 123456; // 對(duì)工號(hào)字段賦值
return 0; // 賦值成功, 返回0
}
程序的執(zhí)行結(jié)果如圖3所示:
圖3第二次改進(jìn)后的程序代碼執(zhí)行結(jié)果
從圖3可以看出,程序執(zhí)行結(jié)果正確,得到了我們想要的結(jié)果。
在編寫代碼的過程中,我們需要注意以下方面:
(1) 程序頭部、函數(shù)頭部及重要的程序語句處一定要有注釋,這體現(xiàn)了軟件開發(fā)人員的專業(yè)素養(yǎng)。
(2) 函數(shù)中出現(xiàn)的變量在定義的同時(shí)要進(jìn)行初始化,函數(shù)在調(diào)用之前一定要先進(jìn)行聲明。
(3) 對(duì)于函數(shù)中的指針變量參數(shù),在使用之前一定要先進(jìn)行異常判斷(即判斷其是否為NULL)。
(4) 對(duì)于有返回值的函數(shù),要用不同的返回值來區(qū)別不同的執(zhí)行結(jié)果,并在重要的地方打印出提示信息,方便對(duì)代碼的調(diào)試。
指針是C語言的精華所在,同時(shí)也是難點(diǎn)所在。對(duì)于一個(gè)合格的軟件開發(fā)工程師來說,一定要熟練掌握指針的使用方法。
網(wǎng)頁名稱:C語言中結(jié)構(gòu)體參數(shù)變量的傳遞
標(biāo)題網(wǎng)址:http://chinadenli.net/article18/pigidp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、微信小程序、網(wǎng)站導(dǎo)航、自適應(yīng)網(wǎng)站、服務(wù)器托管、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)