1. 程式人生 > 其它 >C/C++語言結構體指標的使用

C/C++語言結構體指標的使用

C/C++語言結構體指標的使用

主要內容

  1. 結構體的使用 - 定義,賦值,結構體指標
  2. 結構體作為函式引數的使用
  3. 指標的使用

程式碼內容重點

  1. 結構體的使用 - 定義,賦值,結構體指標
  2. 結構體作為函式引數的使用 - 最好使用結構體指標作為引數,而不是結構體
    因為當傳遞的結構體作為引數,資料量較大時,會佔用較大的時間與空間,效率很低
    使用結構體指標作為函式引數,比用結構體本身作引數效率高很多,當只是讀取而不希望修改結構體值時,可以新增const防止改變結構體成員值
    (STAFF_T const *p)
  3. 指標的使用 - 指標的定義,初始化,申請記憶體空間(malloc),釋放(free)
    指標在32位系統佔用4Byte,在64位系統佔用8Byte
    注意:
    使用malloc申請空間的指標,當不使用後需要手動釋放,避免佔用記憶體,並最好重新賦值為NULL,例p = NULL;
    malloc後記得判斷是否成功
    指標的定義和初始化
    int* p;
    int i;
    p = &i;
    或者初始化為NULL
    int* p = NULL;

C語言程式碼例子

這C程式碼在VSCode和GDB online上成功執行除錯

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

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); // 結構體指標作為函式引數的使用例子

int main()
{   
    int size;
    
    //STAFF_T sta; // 定義一個結構體
    //staff = &sta; // 另外一種結構體初始化
    STAFF_T* staff = NULL; // 定義一個結構體指標,並初始化為NULL;

    // 為結構體申請記憶體空間,需要強制型別轉換(這裡為結構體指標型別),注意malloc成功返回位元組數,失敗返回NULL
    staff = (STAFF_T*)malloc(sizeof(STAFF_T)); 
    // 判斷是否成功申請空間,只有申請成功才能使用,這一步很重要,許多人都容易忘記
    if (staff == NULL)
    {
        printf("malloc(STAFF_T) ERROR\n");
        return -1;
    }

    // 這裡幾行除錯用,打印出在32/64位系統中一些資料型別所佔用的記憶體空間大小不同
    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");
    
    // 傳遞結構體指標
    print_msg(staff); // 引數為指標常量,因為這裡只是讀取staff的值,而不希望修改staff的內容

    // 最後釋放指標,並賦值為NULL。因為指標free後指標所指向的記憶體地址可以被其他變數使用,但指標本身還是指向原來地址,還可以使用,防止野指標
    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)
{
    // 引數為指標常量,因為這裡只是讀取p的值,而不希望修改p的內容
    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);
}