欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入淺析C/C++語言結(jié)構(gòu)體指針的使用注意事項

 更新時間:2021年12月20日 09:31:23   作者:度若飛  
這篇文章主要介紹了C/C++語言結(jié)構(gòu)體指針的使用,大家都知道指針在32位系統(tǒng)占用4Byte,在64位系統(tǒng)占用8Byte,下面看下c語言代碼例子

主要內(nèi)容

  • 結(jié)構(gòu)體的使用 - 定義,賦值,結(jié)構(gòu)體指針
  • 結(jié)構(gòu)體作為函數(shù)參數(shù)的使用
  • 指針的使用

代碼內(nèi)容重點

1.結(jié)構(gòu)體的使用 - 定義,賦值,結(jié)構(gòu)體指針

2.結(jié)構(gòu)體作為函數(shù)參數(shù)的使用 - 最好使用結(jié)構(gòu)體指針作為參數(shù),而不是結(jié)構(gòu)體

因為當(dāng)傳遞的結(jié)構(gòu)體作為參數(shù),數(shù)據(jù)量較大時,會占用較大的時間與空間,效率很低

使用結(jié)構(gòu)體指針作為函數(shù)參數(shù),比用結(jié)構(gòu)體本身作參數(shù)效率高很多,當(dāng)只是讀取而不希望修改結(jié)構(gòu)體值時,可以添加const防止改變結(jié)構(gòu)體成員值

(STAFF_T const *p)

3.指針的使用 - 指針的定義,初始化,申請內(nèi)存空間(malloc),釋放(free)

指針在32位系統(tǒng)占用4Byte,在64位系統(tǒng)占用8Byte

注意:

使用malloc申請空間的指針,當(dāng)不使用后需要手動釋放,避免占用內(nèi)存,并最好重新賦值為NULL,例p = NULL;

malloc后記得判斷是否成功

指針的定義和初始化

int* p;

int i;

p = &i;

或者初始化為NULL

int* p = NULL;

C語言代碼例子

這C代碼在VSCode和GDB online上成功運行調(diào)試

/******************************************************************************

Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.

*******************************************************************************/

#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct Staff_t{
    char* name;
    char sex;
    short age;
    float salary;
    char* date;
} STAFF_T;

void print_msg(STAFF_T const *p); // 結(jié)構(gòu)體指針作為函數(shù)參數(shù)的使用例子

int main()
{   
    int size;
    
    //STAFF_T sta; // 定義一個結(jié)構(gòu)體
    //staff = &sta; // 另外一種結(jié)構(gòu)體初始化
    STAFF_T* staff = NULL; // 定義一個結(jié)構(gòu)體指針,并初始化為NULL;

    // 為結(jié)構(gòu)體申請內(nèi)存空間,需要強制類型轉(zhuǎn)換(這里為結(jié)構(gòu)體指針類型),注意malloc成功返回字節(jié)數(shù),失敗返回NULL
    staff = (STAFF_T*)malloc(sizeof(STAFF_T)); 
    // 判斷是否成功申請空間,只有申請成功才能使用,這一步很重要,許多人都容易忘記
    if (staff == NULL)
    {
        printf("malloc(STAFF_T) ERROR\n");
        return -1;
    }

    // 這里幾行調(diào)試用,打印出在32/64位系統(tǒng)中一些數(shù)據(jù)類型所占用的內(nèi)存空間大小不同
    size = sizeof(STAFF_T);
    printf("STAFF_T size = %d\n",size);
    printf("SIZEOF:\n char*:%lu, char:%lu,short:%lu,float:%lu \n",sizeof(char*),sizeof(char),sizeof(short),sizeof(float));

    staff->name = (char*)malloc(20*sizeof(char));
    
    // 在C語言中,staff->name以下的兩種賦值方式都可以
    staff->name = "duruofei";//strcpy(staff->name, "duruofei");
    staff->sex = 'M';
    staff->age = 29;
    staff->salary = 15000;
    staff->date = (char*)malloc(20*sizeof(char));
    strcpy(staff->date,"2021-12-09");//strcpy(staff->date, "2021-12-09");
    
    // 傳遞結(jié)構(gòu)體指針
    print_msg(staff); // 參數(shù)為指針常量,因為這里只是讀取staff的值,而不希望修改staff的內(nèi)容

    // 最后釋放指針,并賦值為NULL。因為指針free后指針?biāo)赶虻膬?nèi)存地址可以被其他變量使用,但指針本身還是指向原來地址,還可以使用,防止野指針
    free(staff);
    staff = NULL;

    printf("Hello World\n");

    return 0;
}

/**
 * function: print_msg
 * input: STAFF_T const *
 * ouput: none
 * descreption: print massage
 */
void print_msg(STAFF_T const *p)
{
    // 參數(shù)為指針常量,因為這里只是讀取p的值,而不希望修改p的內(nèi)容
    if (p == NULL) 
    {
        printf("print_msg: p is NULL\n");
    }
    
    printf("Name:%s, Sex:%c, Age:%d, Salary:%0.2f, Date:%s\n",\
            p->name, p->sex, p->age, p->salary, p->date);
}

到此這篇關(guān)于C/C++語言結(jié)構(gòu)體指針的使用的文章就介紹到這了,更多相關(guān)C++結(jié)構(gòu)體內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于函數(shù)傳參問題(指針傳參,值傳參,引用傳參)

    關(guān)于函數(shù)傳參問題(指針傳參,值傳參,引用傳參)

    這篇文章主要介紹了關(guān)于函數(shù)傳參問題(指針傳參,值傳參,引用傳參),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • C++實現(xiàn)學(xué)生信息管理系統(tǒng)(完整版)

    C++實現(xiàn)學(xué)生信息管理系統(tǒng)(完整版)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • bmp 縮放代碼(BMP位圖任意放大 和縮小)

    bmp 縮放代碼(BMP位圖任意放大 和縮小)

    這篇文章主要介紹了bmp 縮放代碼(BMP位圖任意放大 和縮小),需要的朋友可以參考下
    2016-04-04
  • C++私有繼承(三)

    C++私有繼承(三)

    這篇文章主要介紹了C++私有繼承(三),前面的文章我們已經(jīng)介紹過了C++私有繼承(一)和(二),下面小編就繼續(xù)基于之前的內(nèi)容繼續(xù)向大家介紹C++私有繼承,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-02-02
  • 解析C++引用

    解析C++引用

    引用是C++引入的新語言特性,是C++常用的一個重要內(nèi)容之一。在工作中發(fā)現(xiàn),許多人使用它僅僅是想當(dāng)然,在某些微妙的場合,很容易出錯,究其原由,大多因為沒有搞清本源。在本篇中將對引用進(jìn)行詳細(xì)討論,希望對大家更好地理解和使用引用起到拋磚引玉的作用
    2021-06-06
  • 深入探討:宏、內(nèi)聯(lián)函數(shù)與普通函數(shù)的區(qū)別

    深入探討:宏、內(nèi)聯(lián)函數(shù)與普通函數(shù)的區(qū)別

    本篇文章是對宏、內(nèi)聯(lián)函數(shù)與普通函數(shù)的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中的變長參數(shù)深入理解

    C++中的變長參數(shù)深入理解

    變長參數(shù)的函數(shù),即參數(shù)個數(shù)可變、參數(shù)類型不定的函數(shù)。設(shè)計一個參數(shù)個數(shù)可變、參數(shù)類型不定的函數(shù)是可能的,最常見的例子是printf函數(shù)、scanf函數(shù)和高級語言的Format函數(shù)。最近的一個項目中就遇到這么一個相關(guān)的問題,感興趣的朋友們下面來一起看看吧。
    2016-10-10
  • c++結(jié)構(gòu)體排序方式(1條件,多條件)

    c++結(jié)構(gòu)體排序方式(1條件,多條件)

    這篇文章主要介紹了c++結(jié)構(gòu)體排序方式(1條件,多條件),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++實現(xiàn)迷宮算法實例解析

    C++實現(xiàn)迷宮算法實例解析

    這篇文章主要介紹了C++實現(xiàn)迷宮算法實例解析,是一個比較經(jīng)典的C++算法,有一定的學(xué)習(xí)與借鑒價值,需要的朋友可以參考下
    2014-07-07
  • 詳解PID控制器原理

    詳解PID控制器原理

    什么是 PID?它是一種在編程中使用的基本方法,如果正確調(diào)整,可以令人難以置信的有效和準(zhǔn)確,PID代表比例積分微分,3個單獨的部分連接在一起,雖然有時你不需要三個都使用。例如,您可以改為有P控制,PI控制或PD控制
    2021-06-06

最新評論