홈 / ► C 언어 코딩 도장 / ► Unit 55. 구조체와 공용체 활용하기 / ► 55.3 익명 구조체와 익명 공용체 활용하기
부분을 공부중인데요, 밑에 텍스트로 붙여넣기한 본문에서 말하는 '익명구조체'는 다음 링크에서 설명하는 익명구조체와 다른건가요?
https://dojang.io/mod/page/view.php?id=410
해당 링크에서는 별칭이 붙은 것만 설명 되있는것 같은데 맞는건가요?
그리고 밑에 3번 라인에 vstruct에서 v는 잘못 붙은건가요?
ps. 55.4 1번 퀴즈에도 S가 빠져있고 Persion 이라고 되어있습니다
truct Phone { int areacode; unsigned long long number; }; struct Person { char name[20]; int age; struct Phone phone; }; int main() { struct Persion p1;
-------------------------
x, y, z 좌표를 저장하는 Vector3 구조체를 정의했습니다. 먼저 맨 안쪽 x, y, z는 float로 선언되어 있으며 익명 구조체입니다(x, y, z는 각각의 값을 독립적인 공간에 저장하기 위해 구조체로 정의합니다. 또한, pos.x처럼 멤버에 바로 접근하기 위해 익명 구조체로 정의합니다). 그리고 익명 공용체가 x, y, z익명 구조체와 배열 v를 감싸고 있습니다(pos.v처럼 멤버에 바로 접근하기 위해 익명 공용체로 정의합니다).
struct Vector3 { // 3차원 벡터 좌표
union { // 익명 공용체
vstruct { // 익명 구조체
float x; // x 좌표
float y; // y 좌표
float z; // z 좌표
};
float v[3]; // 좌표를 배열로 저장
};
};
--------------------
링크에서 설명하는 익명 구조체와 같습니다. 익명 구조체를 단독으로 사용할 때는 typedef로 별칭을 지정해야 합니다.
typedef 없이 익명 구조체만 정의하면 익명 구조체를 사용(선언)할 수가 없습니다.
그리고 구조체(공용체) 안에 익명 구조체가 들어갈 때는 typedef를 사용하지 않습니다.
이때는 안에 들어있는 구조체의 이름을 몰라도 멤버에 접근할 수 있기 때문에 익명 구조체를 활용합니다.
-------------
그리고 밑에 3번 라인에 vstruct에서 v는 잘못 붙은건가요?
-------------
struct가 맞고 v는 잘못 붙은 것입니다.
------------
ps. 55.4 1번 퀴즈에도 S가 빠져있고 Persion 이라고 되어있습니다.
------------
오타 제보 감사합니다.
추가로 제보드립니다.
1))) 다음 해설이 55.9 심사문제: 게임 캐릭터 구조체 포인터 사용하기 랑 둘이 서로 바뀌어있는것 같습니다.
///////////////////////////////////
홈 / ? C 언어 코딩 도장 / ? Unit 55. 구조체와 공용체 활용하기 / ? 55.8 심사문제: 게임 캐릭터 구조체 사용하기
먼저 struct Champion swain;과 같이 구조체 변수를 선언합니다. 그리고 stats는 Champion 구조체 안에 들어있는 구조체이므로 멤버에 접근할 때는 점을 사용하여 변수.멤버.멤버 형태로 접근합니다.
printf에서 Swain 463.000000을 출력하고 있으므로 swain.name에 strcpy 함수로 "Swain"을 복사해주고, swain->stats->health에는 463.0을 할당하면 됩니다.
----------------
printf에서swain->stats->health와 같이 화살표를 두 번 사용하여 멤버에 접근하고 있습니다. 따라서 swain과 stats는 포인터입니다.
먼저 swain에 메모리를 할당한 뒤 swain->stats에 메모리를 할당합니다. 그리고 swain.name에는 strcpy함수로 "Swain"을 복사해주고, swain.stats.health에는 463.0을 넣어주면 됩니다.
///////////////////////////////////
2))) 다음 부분에 포인터 연산에서 괄호부분이 잘못된것 같습니다.
원본은 위고, 아래처럼 하는게 맞지 않나요?
59.2 포인터 연산과 역참조 사용하기
증가, 감소 연산자를 변수 뒤에 붙이고 포인터 연산을 하면 현재 메모리의 값을 가져온 뒤 포인터 연산을 하므로 주의해야 합니다.
printf("%d\n", *(numPtrB++)); // 33: numPtrA의 메모리에 접근하여 값을 가져온 뒤 포인터 연산
printf("%d\n", *(numPtrC--)); // 33: numPtrA의 메모리에 접근하여 값을 가져온 뒤 포인터 연산
----------------
printf("%d\n", *numPtrB++); // 33: numPtrA의 메모리에 접근하여 값을 가져온 뒤 포인터 연산
printf("%d\n", *numPtrC--); // 33: numPtrA의 메모리에 접근하여 값을 가져온 뒤 포인터 연산
///////////////////////////////////
제보 감사합니다.
심사문제 해설을 수정했습니다.
printf("%d\n", *(numPtrB++));
와
printf("%d\n", *numPtrB++);
는 완전히 같습니다.
연산자 우선순위 때문이며, 이 둘은 같습니다.
*numPtrB++에서 ++의 연산자 우선순위가 * 역참조 연산자보다 높습니다. 따라서 *(numPtrB++)로 표기합니다. UNIT 25 연산자 우선순위의 표 25-1 C 언어 연산자 우선순위를 보면 ++ 연산자는 1순위, * 역참조 연산자는 2순위입니다. 따라서 *(numPtrB++) 표기가 맞습니다.
포인터는 증가하지만, 이전 값을 역참조합니다.
numPtrB가 가리키는 위치는 바뀌지만, 이전 값을 역참조하므로 33이 출력됩니다.
numPtrC도 마찬가지로 가리키는 위치는 바뀌지만, 이전 값을 역참조하므로 33이 출력됩니다.
감사합니다.
답변 감사합니다
연산자 우선순위를 제가 착각했네요;
다음 부분도 확인해 주시면 좋겠습니다.
--------------
//////////////////////////////////////////////////////////////////////////////////////////////////
///// a##b#define CONCAT(a, b) a##b 에서 a##b가 맨 앞에 옴
//////////////////////////////////////////////////////////////////////////////////////////////////
매크로 정의하기
#define은 특정 값에 이름을 붙이거나 코드를 조합하여 함수 형태로 만들 수 있습니다. 매크로를 사용하면 전처리기를 거쳐 내부적으로 소스 코드가 일괄 변환됩니다.
// 값을 매크로로 정의 // 10을 COUNT로 정의
#define 매크로이름 값 #define COUNT 10
// 여러 줄을 매크로로 정의 // printf 세 줄을 PRINT_NUM3으로 정의
#define 매크로이름 코드1 \ #define PRINT_NUM3(x) printf("%d\n", x); \
코드2 \ printf("%d\n", x + 1); \
코드3 printf("%d\n", x + 2);
// 값을 붙이는 매크로 정의 // a와 b를 붙이는 CONCAT 매크로 정의
#define 매크로이름(a, b) a##b#define CONCAT(a, b) a##b
-------
//////////////////////////////////////////////////////////////////////////////////////////////////
/////보기 예문이 f까지 6개
//////////////////////////////////////////////////////////////////////////////////////////////////
홈 / ► C 언어 코딩 도장 / ► Unit 78. 전역 변수 사용하기 / ► 78.4 퀴즈
4. 다음 중 외부에 선언된 전역 변수 ten을 사용하는 방법으로 올바른 것을 고르세요.
long long ten = 10;
a. long long ten;
b. extern long ten;
c. long long extern ten;
d. long long ten extern;
e. extern long long ten;
f. extern long ten;
외부에 선언된 전역 변수를 사용할 때는 extern 자료형 전역변수; 형식으로 지정해야 합니다.
정답은 e.입니다.