[英]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.