簡體   English   中英

C 聲明結構數組/指向結構數組的指針

[英]C Declare array of struct/pointer to array of structs

我有一個示例教程,其中包含 2 個文件“functions.c”和“functions.h”,其中包含函數的原型和主體。
在示例中,沒有包含結構數組的聲明/指向結構數組的指針和對函數的調用的主要內容。

功能。c:

#include "functions.h"

const char *getTeamA(const sTest *p)
{
    return p->teamA;
}

void setTeamA(sTest *p, char *s)
{
    strcpy(p->teamA, s);
}

int getNum(const sTest *p)
{
    return p->num;
}

void setNum(sTest *p, int i)
{
    p->num = i;
}

函數.h:

#ifndef FUNCTIONS_H_
#define FUNCTIONS_H_

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

#define MAX_CHAR 20
#define SIZE 5

typedef struct {
    char teamA[MAX_CHAR];
    int num;
    // ...
} sTest;


const char *getTeamA(const sTest *p);
void setTeamA(sTest *p, char *s);

int getNum(const sTest *p);
void setNum(sTest *p, int i);

#endif /* FUNCTIONS_H_ */

所以我的問題是
如何根據上面編寫的代碼聲明結構? 例如:

int main()
{
    sTest data[SIZE];       //size isn't important
    sTest *dataPtr = data;

    setTeamA(dataPtr[0].teamA, "name1");

    // ...

    printf("%d", getNum(dataPtr[1].num)); // just an example. i know that it isn't initialized

    // ...

    return 0;
}

這是正確的方法嗎? 或者有沒有更好的方法來聲明變量並將它們傳遞給函數?
重要的是我必須堅持寫在functions.c和functions.h中的代碼,所以函數不能直接修改結構數據,需要使用指針(因為函數中有成員選擇運算符“->” 。C)。

你不需要有dataPtr 您可以通過執行data[i]來執行完全相同的操作,因為您將 data 聲明為sTest的數組,因此data指向數組中的第一個元素。

讓我們解構您在調用setTeamA(dataPtr[0].teamA, "name1")時所做的事情。 您正在嘗試將數據數組中的第一個 sTest 結構設置為將“name1”作為 teamA 字段。 請注意, setTeamA()的原型實際上接受了sTest *p 在您的示例中,您傳遞的是teamA字段。 所以你真正想要調用的是setTeamA(&dataPtr[0], "name1") 這轉換為指向 dataPtr[0] 處數據的指針。

正如我之前所說,雖然這有效,但 dataPtr 是不必要的。 所以這相當於: setTeamA(&data[0], "name1")

另外值得注意的是,您可以簡單地編寫: setTeamA(data, "name1")因為 data 已經是指向數組中第一個元素的指針。

使用 setTeamA(&data[0], "name1")

它索引到索引 0,然后獲取結果的引用(這是一個指針),因此將類型設置為 sTest* 然后 setTeamA function 將完成設置 teamA 字段的工作。

那個 dataPtr 變量在這里沒用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM