国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

結構體中指針賦值問題的分析及C代碼示例

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

[[178653]]

問題描述

某結構體的定義如下:

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

請問如何對結構體中的各個成員變量(尤其是指針變量)進行賦值?

問題分析及C代碼示例

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

我們把結構體T_PeopleInfo放到具體的C代碼中,以直觀地展現對結構體中的各個成員變量的賦值方法。

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

  1. /********************************************************************** 
  2. * 版權所有 (C)2016, Zhou Zhaoxiong。 
  3. * 文件名稱:PointerTest.c 
  4. * 文件標識:無 
  5. * 內容摘要:演示指針的用法 
  6. * 其它說明:無 
  7. * 當前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20160712 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12.  
  13.  
  14. // 重定義數據類型 
  15. typedef signed   int        INT32; 
  16. typedef unsigned int        UINT32; 
  17. typedef unsigned char       UINT8; 
  18.  
  19. // 結構體定義 
  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. * 功能描述: 主函數 
  30. * 輸入參數: 無 
  31. * 輸出參數: 無 
  32. * 返 回 值: 0-執行完成 
  33. * 其他說明: 無 
  34. * 修改日期       版本號        修改人        修改內容 
  35. ------------------------------------------------------------- 
  36. * 20160712        V1.0     Zhou Zhaoxiong     創建 
  37. ****************************************************************/ 
  38. INT32 main(void) 
  39.     T_PeopleInfo tPeopleInfo = {0}; 
  40.  
  41.     // 結構體變量賦值 
  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中,我們按照對結構體中的數組的賦值方法對指針賦值,程序可以編譯通過,但運行的時候,程序便會掛掉。究其原因,是因為沒有為pszAddr2和pszAddr3指針分配內存空間。

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

  1. /********************************************************************** 
  2. * 版權所有 (C)2016, Zhou Zhaoxiong。 
  3. * 文件名稱:PointerTest.c 
  4. * 文件標識:無 
  5. * 內容摘要:演示指針的用法 
  6. * 其它說明:無 
  7. * 當前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20160712 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12.  
  13.  
  14. // 重定義數據類型 
  15. typedef signed   int        INT32; 
  16. typedef unsigned int        UINT32; 
  17. typedef signed   char       INT8; 
  18.  
  19. // 結構體定義 
  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. * 功能描述: 主函數 
  30. * 輸入參數: 無 
  31. * 輸出參數: 無 
  32. * 返 回 值: 0-執行完成 
  33. * 其他說明: 無 
  34. * 修改日期       版本號        修改人        修改內容 
  35. ------------------------------------------------------------- 
  36. * 20160712        V1.0     Zhou Zhaoxiong     創建 
  37. ****************************************************************/ 
  38. INT32 main(void) 
  39.     T_PeopleInfo tPeopleInfo = {0}; 
  40.  
  41.     // 結構體變量賦值 
  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分配了內存空間(注意,執行malloc之后,要判斷指針是否為空),此時就可以將變量值賦給它們。程序編譯和運行都是正常的,輸出結果如下:

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

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

  1. * 版權所有 (C)2016, Zhou Zhaoxiong。 
  2. * 文件名稱:PointerTest.c 
  3. * 文件標識:無 
  4. * 內容摘要:演示指針的用法 
  5. * 其它說明:無 
  6. * 當前版本:V1.0 
  7. * 作    者:Zhou Zhaoxiong 
  8. * 完成日期:20160712 
  9. **********************************************************************/ 
  10. #include <stdio.h> 
  11.  
  12.  
  13. // 重定義數據類型 
  14. typedef signed   int        INT32; 
  15. typedef unsigned int        UINT32; 
  16. typedef signed   char       INT8; 
  17.  
  18. // 結構體定義 
  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. * 功能描述: 主函數 
  29. * 輸入參數: 無 
  30. * 輸出參數: 無 
  31. * 返 回 值: 0-執行完成 
  32. * 其他說明: 無 
  33. * 修改日期       版本號        修改人        修改內容 
  34. ------------------------------------------------------------- 
  35. * 20160712        V1.0     Zhou Zhaoxiong     創建 
  36. ****************************************************************/ 
  37. INT32 main(void) 
  38.     T_PeopleInfo tPeopleInfo = {0}; 
  39.  
  40.     // 結構體變量賦值 
  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,也就是將這兩個字符串的首地址賦給了指針。那么,指針所指向的地址中存放的內容就是字符串的值。程序編譯和運行都是正常的,輸出結果如下:

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

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

  1. /********************************************************************** 
  2. * 版權所有 (C)2016, Zhou Zhaoxiong。 
  3. * 文件名稱:PointerTest.c 
  4. * 文件標識:無 
  5. * 內容摘要:演示指針的用法 
  6. * 其它說明:無 
  7. * 當前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20160712 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12.  
  13.  
  14. // 重定義數據類型 
  15. typedef signed   int        INT32; 
  16. typedef unsigned int        UINT32; 
  17. typedef signed   char       INT8; 
  18.  
  19. // 結構體定義 
  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. * 功能描述: 主函數 
  30. * 輸入參數: 無 
  31. * 輸出參數: 無 
  32. * 返 回 值: 0-執行完成 
  33. * 其他說明: 無 
  34. * 修改日期       版本號        修改人        修改內容 
  35. ------------------------------------------------------------- 
  36. * 20160712        V1.0     Zhou Zhaoxiong     創建 
  37. ****************************************************************/ 
  38. INT32 main(void) 
  39.     T_PeopleInfo tPeopleInfo = {0}; 
  40.  
  41.     // 結構體變量賦值 
  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分配了內存空間,然后便可以使用該指針來接收字符串變量的值(注意,這里是將“Wuhan, China!”賦給了*(tPeopleInfo.pszAddr3))。程序編譯和運行都是正常的,輸出結果如下:

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

總結

本文對結構體中指針賦值問題進行了分析,并用C代碼演示了指針的賦值方法。

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

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

責任編輯:武曉燕 來源: csdn博客
相關推薦

2022-01-12 08:30:55

結構體指針STM32

2009-08-13 15:41:50

C#結構體指針

2023-10-10 13:58:00

C語言代碼結構體

2009-08-31 15:02:22

C#解析結構體指針

2021-05-11 11:31:52

C語言類型指針

2024-05-16 12:23:45

C語言指針代碼

2011-07-20 16:43:34

C++

2011-04-11 14:18:37

CC++指針

2014-04-01 10:11:33

C語言指針

2022-09-30 15:03:09

C語言深拷貝淺拷貝

2021-11-25 10:36:04

DNS命令Linux

2016-12-20 11:12:11

C代碼自測開發

2017-05-27 06:32:36

JSONC代碼函數

2024-06-18 08:37:25

場景異步編程代碼

2024-06-24 03:00:00

2009-08-13 11:18:50

C#結構體

2009-08-14 11:05:28

C#語言的結構體

2009-08-13 14:46:03

C#結構體定義

2009-08-27 15:53:30

C#中using wo

2022-01-09 23:04:19

語言打印結構體
點贊
收藏

51CTO技術棧公眾號

噜噜噜在线观看免费视频日韩 | 粉嫩精品导航导航| 亚洲图片有声小说| 亚洲五月天综合| 丝袜美腿高跟呻吟高潮一区| 亚洲在线一区二区| 欧美1区2区| 成人疯狂猛交xxx| 日韩免费在线电影| 国产午夜精品一区二区| 精品国产一区二区三区麻豆免费观看完整版 | 中文字幕不卡av| 韩日视频在线观看| 欧美日韩久久精品| 精品久久久久久久大神国产| 91pron在线| 日韩亚洲国产免费| 中文字幕在线观看一区| 妞干网在线视频观看| 精品三级av| 国产麻豆精品视频| 亚洲天堂男人天堂女人天堂| 久久久久国产一区二区| 欧美福利在线观看| 午夜免费视频在线国产| 一区二区三区免费看视频| 日本激情综合网| 久久久蜜臀国产一区二区| 久久久久久久久久久久久久一区| 亚洲欧美日本伦理| 国语自产偷拍精品视频偷| 日本精品另类| 亚洲国产欧美自拍| 最新真实国产在线视频| 在线一区二区三区四区| freemovies性欧美| 欧美视频在线播放| 日本高清视频在线播放| 欧美一区二区三区小说| 国产精品剧情一区二区在线观看| 日韩一区二区影院| 国内在线免费视频| 日韩欧美一二三区| 筱崎爱全乳无删减在线观看| 日韩电影免费观看在线观看| 99在线视频影院| 亚洲精品国产综合区久久久久久久| av免费在线网站| 中文字幕亚洲国产| 秋霞影视一区二区三区| 国产精品久久久久久久久久东京 | 国产精品视频| 欧美午夜片欧美片在线观看| 日韩国产高清一区| heyzo高清中文字幕在线| 91精品国产色综合久久不卡蜜臀 | 伊人伊人伊人久久| 中文在线免费一区三区| 91超碰中文字幕久久精品| 欧美成人久久| 裸体裸乳免费看| 狠狠躁18三区二区一区| 国产精品免费在线免费| 免费视频一区二区三区在线观看| 久久99久久99精品| 色偷偷88欧美精品久久久| 91福利在线免费| 国产91精品青草社区| 日韩精品91亚洲二区在线观看| 免费成人进口网站| 亚洲成av人片| 成人精品一区二区三区电影| 亚洲一区二区三区四区视频| 国产欧美一区二区精品秋霞影院 | 亚洲综合网站| 一本色道婷婷久久欧美| 婷婷开心久久网| 成人在线分类| 蜜桃av噜噜一区二区三区| 国产精品久久看| 中文字幕在线看片| 亚洲一区二区在线| 一区二区三区欧美激情| 国产精品久久乐| 亚洲色欲久久久综合网东京热| 日本高清无吗v一区| 日韩免费视频| 国产黄色高清在线| 97在线视频免费观看| 久久久亚洲欧洲日产国码αv| 成人ssswww在线播放| 免费一区二区三区| 欧美综合天天夜夜久久| 91影院成人| 手机福利视频欧美| 国产精品视频一区国模私拍| 亚洲欧美综合色| 黑人操亚洲人| 成人a视频在线| 国产精品网址在线| 日韩av黄色在线| 日本大片在线观看| 国产美女91呻吟求| 欧美视频免费在线| 亚洲国产午夜| av中文字幕在线看| 日本久久久精品视频| 欧美激情精品久久久久久蜜臀| av电影一区二区| 精品一区毛片| 邻居大乳一区二区三区| 久久99久久精品国产| 日韩成人久久久| 国产在线视频一区二区| 视频二区欧美| 中文字幕在线播放第一页| 高清视频一区二区三区| 亚洲精品www久久久久久广东| 男人的天堂亚洲一区| 亚洲国产综合在线观看| 福利资源在线久| 日韩免费三级| 91成人在线播放| 欧美精品乱码久久久久久| ww亚洲ww在线观看国产| 狠狠88综合久久久久综合网| 国产不卡网站| 韩日在线视频| 激情综合网婷婷| 不卡视频一区| 久久久久亚洲精品成人网小说| 欧美三级韩国三级日本一级| 国产乱子轮精品视频| 婷婷综合在线| 91亚洲精品在看在线观看高清| 牛牛热在线视频| 欧美丰满熟妇xxxxx| 999视频在线免费观看| 午夜精品久久久久久久白皮肤| 美日韩精品免费视频| 日韩av电影手机在线观看| 国产欧美一区二区三区久久人妖| 999国产在线| ijzzijzzij亚洲大全| 国产xxxxx视频| 自拍视频在线免费观看| 欧美羞羞视频| 欧美大人香蕉在线| 喷水一区二区三区| 国产精品三级在线观看| 色综合久久中文综合久久牛| 日韩一区二区免费视频| 日韩中文字幕第一页| 国产精品美女www| 日本一区二区三不卡| 久久久精品麻豆| 麻豆最新免费在线视频| 国产精品伦一区二区| 黄色羞羞视频在线观看| 成全电影播放在线观看国语| 宅男视频免费在线观看视频| 国产三级av在线| 国产乱视频在线观看| av色图一区| 日韩三级不卡| 91超碰国产在线| 精品美女一区| 在线精品国产| 久久久精品国产免大香伊| 欧美天堂一区二区三区| 精品国模在线视频| 国产精品一二三在线| 国产一区精品在线| 丝袜老师办公室里做好紧好爽| 欧美精品一区二区三区涩爱蜜| 性欧美videos高清hd4k| 成人性生交大片免费看中文视频| 一本到12不卡视频在线dvd| 天堂影院一区二区| 国产日韩欧美在线一区| 欧美日韩精品一二三区| 热久久99这里有精品| 18视频在线观看娇喘| 免费观看v片在线观看| 亚洲第一会所| 天堂一区二区在线免费观看| 亚洲制服欧美中文字幕中文字幕| 亚洲乱码中文字幕综合| 99久久精品国产导航| 欧美专区一区二区三区| 午夜日韩影院| 麻豆视频网站在线观看| 四虎黄色影院| yy111111少妇影院日韩夜片| 一区二区三区高清国产| 国产三级欧美三级日产三级99| 免费在线亚洲欧美| 欧美一区二区三区激情视频| 国产成人亚洲综合a∨婷婷| 在线观看区一区二|