自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

結(jié)構(gòu)體中指針賦值問題的分析及C代碼示例

開發(fā) 開發(fā)工具
本文對結(jié)構(gòu)體中指針賦值問題進(jìn)行了分析,并用C代碼演示了指針的賦值方法。在實(shí)際的C語言項(xiàng)目中,很多程序出現(xiàn)問題,就是對指針的處理不當(dāng)造成的。因此,熟練掌握各種指針的使用方法,是對一個合格的軟件開發(fā)人員的基本要求。

[[178653]]

問題描述

某結(jié)構(gòu)體的定義如下:

  1. typedef struct 
  2.     int     iAge;                // 年齡 
  3.     char    szAddr1[100];        // 地址1 
  4.     char   *pszAddr2;            // 地址2 
  5.     char  **pszAddr3;            // 地址3 
  6. } T_PeopleInfo; 

請問如何對結(jié)構(gòu)體中的各個成員變量(尤其是指針變量)進(jìn)行賦值?

問題分析及C代碼示例

我們可以看到,在結(jié)構(gòu)體T_PeopleInfo中,pszAddr2和pszAddr3均為指針,其中pszAddr2為一級指針,pszAddr3為二級指針。本文的重點(diǎn),就是要找到對一級指針和二級指針賦值的正確方法。

我們把結(jié)構(gòu)體T_PeopleInfo放到具體的C代碼中,以直觀地展現(xiàn)對結(jié)構(gòu)體中的各個成員變量的賦值方法。

我們首先編寫如下程序(程序1):

  1. /********************************************************************** 
  2. * 版權(quán)所有 (C)2016, Zhou Zhaoxiong。 
  3. * 文件名稱:PointerTest.c 
  4. * 文件標(biāo)識:無 
  5. * 內(nèi)容摘要:演示指針的用法 
  6. * 其它說明:無 
  7. * 當(dāng)前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20160712 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12.  
  13.  
  14. // 重定義數(shù)據(jù)類型 
  15. typedef signed   int        INT32; 
  16. typedef unsigned int        UINT32; 
  17. typedef unsigned char       UINT8; 
  18.  
  19. // 結(jié)構(gòu)體定義 
  20. typedef struct 
  21.     UINT32   iAge;                    // 年齡 
  22.     UINT8    szAddr1[100];            // 地址1 
  23.     UINT8   *pszAddr2;                // 地址2 
  24.     UINT8  **pszAddr3;                // 地址3 
  25. } T_PeopleInfo; 
  26.  
  27.  
  28. /**************************************************************** 
  29. * 功能描述: 主函數(shù) 
  30. * 輸入?yún)?shù): 無 
  31. * 輸出參數(shù): 無 
  32. * 返 回 值: 0-執(zhí)行完成 
  33. * 其他說明: 無 
  34. * 修改日期       版本號        修改人        修改內(nèi)容 
  35. ------------------------------------------------------------- 
  36. * 20160712        V1.0     Zhou Zhaoxiong     創(chuàng)建 
  37. ****************************************************************/ 
  38. INT32 main(void) 
  39.     T_PeopleInfo tPeopleInfo = {0}; 
  40.  
  41.     // 結(jié)構(gòu)體變量賦值 
  42.     // 對iAge賦值 
  43.     tPeopleInfo.iAge = 10; 
  44.  
  45.     // 對szAddr1賦值 
  46.     strncpy(tPeopleInfo.szAddr1, "Chongqing, China!", strlen("Chongqing, China!")); 
  47.  
  48.     // 對pszAddr2賦值 
  49.     strncpy(tPeopleInfo.pszAddr2, "Chengdu, China!", strlen("Chengdu, China!")); 
  50.  
  51.     // 對pszAddr3賦值 
  52.     strncpy(tPeopleInfo.pszAddr3, "Wuhan, China!", strlen("Wuhan, China!")); 
  53.  
  54.     // 打印變量的值 
  55.     printf("Age=%d, Addr1=%s, Addr2=%s, Addr3=%s", tPeopleInfo.iAge, tPeopleInfo.szAddr1, tPeopleInfo.pszAddr2, tPeopleInfo.pszAddr3); 
  56.  
  57.     return 0; 
  58.  

在程序1中,我們按照對結(jié)構(gòu)體中的數(shù)組的賦值方法對指針賦值,程序可以編譯通過,但運(yùn)行的時候,程序便會掛掉。究其原因,是因?yàn)闆]有為pszAddr2和pszAddr3指針分配內(nèi)存空間。

我們對程序1進(jìn)行改進(jìn),編寫出以下程序(程序2):

  1. /********************************************************************** 
  2. * 版權(quán)所有 (C)2016, Zhou Zhaoxiong。 
  3. * 文件名稱:PointerTest.c 
  4. * 文件標(biāo)識:無 
  5. * 內(nèi)容摘要:演示指針的用法 
  6. * 其它說明:無 
  7. * 當(dāng)前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20160712 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12.  
  13.  
  14. // 重定義數(shù)據(jù)類型 
  15. typedef signed   int        INT32; 
  16. typedef unsigned int        UINT32; 
  17. typedef signed   char       INT8; 
  18.  
  19. // 結(jié)構(gòu)體定義 
  20. typedef struct 
  21.     UINT32   iAge;                    // 年齡 
  22.     INT8     szAddr1[100];            // 地址1 
  23.     INT8    *pszAddr2;                // 地址2 
  24.     INT8   **pszAddr3;                // 地址3 
  25. } T_PeopleInfo; 
  26.  
  27.  
  28. /**************************************************************** 
  29. * 功能描述: 主函數(shù) 
  30. * 輸入?yún)?shù): 無 
  31. * 輸出參數(shù): 無 
  32. * 返 回 值: 0-執(zhí)行完成 
  33. * 其他說明: 無 
  34. * 修改日期       版本號        修改人        修改內(nèi)容 
  35. ------------------------------------------------------------- 
  36. * 20160712        V1.0     Zhou Zhaoxiong     創(chuàng)建 
  37. ****************************************************************/ 
  38. INT32 main(void) 
  39.     T_PeopleInfo tPeopleInfo = {0}; 
  40.  
  41.     // 結(jié)構(gòu)體變量賦值 
  42.     // 對iAge賦值 
  43.     tPeopleInfo.iAge = 10; 
  44.  
  45.     // 對szAddr1賦值 
  46.     strncpy(tPeopleInfo.szAddr1, "Chongqing, China!", strlen("Chongqing, China!")); 
  47.  
  48.     // 對pszAddr2賦值 
  49.     tPeopleInfo.pszAddr2 = (INT8 *)malloc(100); 
  50.     if (tPeopleInfo.pszAddr2 == NULL
  51.     { 
  52.         return -1; 
  53.     } 
  54.     strncpy(tPeopleInfo.pszAddr2, "Chengdu, China!", strlen("Chengdu, China!")); 
  55.  
  56.     // 對pszAddr3賦值 
  57.     tPeopleInfo.pszAddr3 = (INT8 *)malloc(100); 
  58.     if (tPeopleInfo.pszAddr3 == NULL
  59.     { 
  60.         return -2; 
  61.     } 
  62.     strncpy(tPeopleInfo.pszAddr3, "Wuhan, China!", strlen("Wuhan, China!")); 
  63.  
  64.     // 打印變量的值 
  65.     printf("Age=%d, Addr1=%s, Addr2=%s, Addr3=%s\n", tPeopleInfo.iAge, tPeopleInfo.szAddr1, tPeopleInfo.pszAddr2, tPeopleInfo.pszAddr3); 
  66.  
  67.     return 0; 

在程序2中,我們先使用malloc為pszAddr2和pszAddr3分配了內(nèi)存空間(注意,執(zhí)行malloc之后,要判斷指針是否為空),此時就可以將變量值賦給它們。程序編譯和運(yùn)行都是正常的,輸出結(jié)果如下:

  1. ~/zhouzx/Test/PointerTest> PointerTest  
  2. Age=10, Addr1=Chongqing, China!, Addr2=Chengdu, China!, Addr3=Wuhan, China! 

除了程序2可以實(shí)現(xiàn)對一級指針和二級指針的正常賦值之外,我們還可以編寫如下程序(程序3):

  1. * 版權(quán)所有 (C)2016, Zhou Zhaoxiong。 
  2. * 文件名稱:PointerTest.c 
  3. * 文件標(biāo)識:無 
  4. * 內(nèi)容摘要:演示指針的用法 
  5. * 其它說明:無 
  6. * 當(dāng)前版本:V1.0 
  7. * 作    者:Zhou Zhaoxiong 
  8. * 完成日期:20160712 
  9. **********************************************************************/ 
  10. #include <stdio.h> 
  11.  
  12.  
  13. // 重定義數(shù)據(jù)類型 
  14. typedef signed   int        INT32; 
  15. typedef unsigned int        UINT32; 
  16. typedef signed   char       INT8; 
  17.  
  18. // 結(jié)構(gòu)體定義 
  19. typedef struct 
  20.     UINT32   iAge;                    // 年齡 
  21.     INT8     szAddr1[100];            // 地址1 
  22.     INT8    *pszAddr2;                // 地址2 
  23.     INT8   **pszAddr3;                // 地址3 
  24. } T_PeopleInfo; 
  25.  
  26.  
  27. /**************************************************************** 
  28. * 功能描述: 主函數(shù) 
  29. * 輸入?yún)?shù): 無 
  30. * 輸出參數(shù): 無 
  31. * 返 回 值: 0-執(zhí)行完成 
  32. * 其他說明: 無 
  33. * 修改日期       版本號        修改人        修改內(nèi)容 
  34. ------------------------------------------------------------- 
  35. * 20160712        V1.0     Zhou Zhaoxiong     創(chuàng)建 
  36. ****************************************************************/ 
  37. INT32 main(void) 
  38.     T_PeopleInfo tPeopleInfo = {0}; 
  39.  
  40.     // 結(jié)構(gòu)體變量賦值 
  41.     // 對iAge賦值 
  42.     tPeopleInfo.iAge = 10; 
  43.  
  44.     // 對szAddr1賦值 
  45.     strncpy(tPeopleInfo.szAddr1, "Chongqing, China!", strlen("Chongqing, China!")); 
  46.  
  47.     // 對pszAddr2賦值 
  48.     tPeopleInfo.pszAddr2 = "Chengdu, China!"
  49.  
  50.     // 對pszAddr3賦值 
  51.     tPeopleInfo.pszAddr3 = "Wuhan, China!"
  52.  
  53.     // 打印變量的值 
  54.     printf("Age=%d, Addr1=%s, Addr2=%s, Addr3=%s\n", tPeopleInfo.iAge, tPeopleInfo.szAddr1, tPeopleInfo.pszAddr2, tPeopleInfo.pszAddr3); 
  55.  
  56.     return 0; 
  57.  

在程序3中,我們直接將字符串賦給了pszAddr2和pszAddr3,也就是將這兩個字符串的首地址賦給了指針。那么,指針?biāo)赶虻牡刂分写娣诺膬?nèi)容就是字符串的值。程序編譯和運(yùn)行都是正常的,輸出結(jié)果如下:

  1. ~/zhouzx/Test/PointerTest> PointerTest  
  2. Age=10, Addr1=Chongqing, China!, Addr2=Chengdu, China!, Addr3=Wuhan, China! 

另,對于二級指針的賦值,我們還可以編寫如下程序(程序4):

  1. /********************************************************************** 
  2. * 版權(quán)所有 (C)2016, Zhou Zhaoxiong。 
  3. * 文件名稱:PointerTest.c 
  4. * 文件標(biāo)識:無 
  5. * 內(nèi)容摘要:演示指針的用法 
  6. * 其它說明:無 
  7. * 當(dāng)前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20160712 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12.  
  13.  
  14. // 重定義數(shù)據(jù)類型 
  15. typedef signed   int        INT32; 
  16. typedef unsigned int        UINT32; 
  17. typedef signed   char       INT8; 
  18.  
  19. // 結(jié)構(gòu)體定義 
  20. typedef struct 
  21.     UINT32   iAge;                    // 年齡 
  22.     INT8     szAddr1[100];            // 地址1 
  23.     INT8    *pszAddr2;                // 地址2 
  24.     INT8   **pszAddr3;                // 地址3 
  25. } T_PeopleInfo; 
  26.  
  27.  
  28. /**************************************************************** 
  29. * 功能描述: 主函數(shù) 
  30. * 輸入?yún)?shù): 無 
  31. * 輸出參數(shù): 無 
  32. * 返 回 值: 0-執(zhí)行完成 
  33. * 其他說明: 無 
  34. * 修改日期       版本號        修改人        修改內(nèi)容 
  35. ------------------------------------------------------------- 
  36. * 20160712        V1.0     Zhou Zhaoxiong     創(chuàng)建 
  37. ****************************************************************/ 
  38. INT32 main(void) 
  39.     T_PeopleInfo tPeopleInfo = {0}; 
  40.  
  41.     // 結(jié)構(gòu)體變量賦值 
  42.     // 對iAge賦值 
  43.     tPeopleInfo.iAge = 10; 
  44.  
  45.     // 對szAddr1賦值 
  46.     strncpy(tPeopleInfo.szAddr1, "Chongqing, China!", strlen("Chongqing, China!")); 
  47.  
  48.     // 對pszAddr2賦值 
  49.     tPeopleInfo.pszAddr2 = "Chengdu, China!"
  50.  
  51.     // 對pszAddr3賦值 
  52.     tPeopleInfo.pszAddr3 = (INT8 *)malloc(100); 
  53.     if (tPeopleInfo.pszAddr3 == NULL
  54.     { 
  55.         return -1; 
  56.     } 
  57.     *(tPeopleInfo.pszAddr3) = "Wuhan, China!"
  58.  
  59.     // 打印變量的值 
  60.     printf("Age=%d, Addr1=%s, Addr2=%s, Addr3=%s\n", tPeopleInfo.iAge, tPeopleInfo.szAddr1, tPeopleInfo.pszAddr2, *(tPeopleInfo.pszAddr3)); 
  61.  
  62.     return 0; 

在程序4中,我們先用malloc為pszAddr3分配了內(nèi)存空間,然后便可以使用該指針來接收字符串變量的值(注意,這里是將“Wuhan, China!”賦給了*(tPeopleInfo.pszAddr3))。程序編譯和運(yùn)行都是正常的,輸出結(jié)果如下:

  1. ~/zhouzx/Test/PointerTest> PointerTest  
  2. Age=10, Addr1=Chongqing, China!, Addr2=Chengdu, China!, Addr3=Wuhan, China! 

總結(jié)

本文對結(jié)構(gòu)體中指針賦值問題進(jìn)行了分析,并用C代碼演示了指針的賦值方法。

在實(shí)際的C語言項(xiàng)目中,很多程序出現(xiàn)問題,就是對指針的處理不當(dāng)造成的。因此,熟練掌握各種指針的使用方法,是對一個合格的軟件開發(fā)人員的基本要求。

【本文是51CTO專欄作者周兆熊的原創(chuàng)文章,作者微信公眾號:周氏邏輯(logiczhou)】

責(zé)任編輯:武曉燕 來源: csdn博客
相關(guān)推薦

2022-01-12 08:30:55

結(jié)構(gòu)體指針STM32

2009-08-13 15:41:50

C#結(jié)構(gòu)體指針

2023-10-10 13:58:00

C語言代碼結(jié)構(gòu)體

2009-08-31 15:02:22

C#解析結(jié)構(gòu)體指針

2021-05-11 11:31:52

C語言類型指針

2024-05-16 12:23:45

C語言指針代碼

2011-07-20 16:43:34

C++

2014-04-01 10:11:33

C語言指針

2011-04-11 14:18:37

CC++指針

2022-09-30 15:03:09

C語言深拷貝淺拷貝

2021-11-25 10:36:04

DNS命令Linux

2016-12-20 11:12:11

C代碼自測開發(fā)

2017-05-27 06:32:36

JSONC代碼函數(shù)

2024-06-18 08:37:25

場景異步編程代碼

2024-06-24 03:00:00

2009-08-13 11:18:50

C#結(jié)構(gòu)體

2009-08-14 11:05:28

C#語言的結(jié)構(gòu)體

2009-08-13 14:46:03

C#結(jié)構(gòu)體定義

2009-08-27 15:53:30

C#中using wo

2022-01-09 23:04:19

語言打印結(jié)構(gòu)體
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號