프로토 타입과 함수 본문이 포함 된 "functions.c"및 "functions.h"파일 2 개가 포함 된 예제 자습서가 있습니다.
예제에는 구조체 배열에 대한 구조체 / 포인터 배열 선언과 함수 호출을 포함하는 메인이 없습니다.
functions.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;
}
functions.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로 작성된 코드를 고수해야한다는 것입니다. 따라서 함수가 구조체 데이터를 직접 수정할 수 없으므로 포인터를 사용해야합니다 (함수에 멤버 선택 연산자 "->"가 있기 때문). .씨).
필요하지 않습니다 dataPtr
. data[i]
데이터를 sTest
s 의 배열로 선언했기 때문에를 수행하여 똑같은 작업을 수행 할 수 있으므로 배열의 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")
데이터는 이미 배열의 첫 번째 요소에 대한 포인터이기 때문에 간단히 작성할 수 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다