구조체(7)
구조체에서 포인터가 사용되는 경우는 2가지이다.
1. 구조체를 가리키는 포인터
2. 포인터를 멤버로 가지는 구초제
일단 먼저 구조체를 가리키는 포인터를 알아보자
※ 구조체를 가리키는 포인터 ※
변수를 가리키는 포인터를 만들 수 있는 것처럼 구조체를 가리키는 포인터도 만들 수 있다.
구조체 포인터는 다음과 같이 선언된다.
아래 예시 코드를 봐보자
ex :
struct student s = {20070001, "sean", 4.3};
struct student *p;
p = &s;
printf("학번 = %d 이름=%s 학점=%f \n", (*p).number, (*p).name, (*p).grade);
해석
포인터 p는 student 구조체를 가리킬 수 있는 포인터이다.
구조체 포인터 p와 구조체 변수 s를 연결하려면 주소를 p에 대입해줘야 하기 때문에
&연산자를 이용해서 구조체 변수의 주소를 구조체 포인터에게 보내주면 된다.
포인터를 이용하여 구조체의 멤버를 액세스 하려면 예시 문장과 같이
(*p).number 이라고 하면 된다.
그렇다면 의미는 *p가 구조체를 가리키고
가리키고 있는 구조체의 멤버를 참조하는 것이다.
참고로 표기할 때 () 없이 *p.number이라고 하면
' . '(닷) 연산자의 우선순위가 *(애스터리스크) 연산자보다 높기 때문이다.
그렇다면 위의 *p.number 문장의 순위는
p.number가 먼저 계산된 다음에 *(p.number)가 계산된다.
그러나 우리가 원하는 것은 *p를 먼저 계산하여 구조체 포인터가 가리키는
구조체 변수를 참조하고, 그다음 멤버를 참조하는 것이다.
※ 간접 멤버 연산자(indirect membership operator) ※
포인터를 이용해서 구조체의 멤버를 가리키는 것은 프로그램에서 자주 등장한다.
때문에 이것을 위한 C언어에서 제공하는 특수 연산자가 있는데,
그 연산자는 '->' 연산자이다.
'->' 연산자는 간점 멤버 연산자라고 불린다.
역할은 구조체 포인터를 이용하여 멤버에 접근할 때 사용하는 연산자이다.
ex :
p -> number;
해석
위 문장은 (*p).number과 같은 의미의 문장이며,
포인터 p가 가리키는 구조체 변수의 멤버 number을 참조한다라는 뜻이다.
p -> number; 이나 *(p).number 둘 중 어느 것을 써도 의미는 완전히 일치하지만,
간접 멤버 연산자를 사용하면 훨씬 간편하게 표기할 수 있어서 많이 사용된다.
※ 혼동하기 쉬운 구조체 변수와 구조체 포인터의 조합 ※
1. (*p).number
순서 : ()로 싸인 *p가 먼저 계산된 뒤에 멤버 number을 계산한다.
해석 : 포인터 p가 가리키는 구조체의 멤버 number를 참조한다 라는 의미이다.
2. p -> number
순서 : 우선순위가 높고 낮음이 없어서 왼쪽에서부터 오른쪽으로 계산한다.
해석 : 포인터 p가 가리키는 구조체의 멤버 number를 의미한다.
(*p).number와 완전히 동일한 의미이다. 표기법만 다를 뿐이다.
3. *p.number
순서 : 아까도 설명했듯이' . '(닷) 연산자가 *(간접 참조) 연산자보다 우선순위가 높다.
위의 문장의 우선순위를 확실히 하기 위해서 ()를 추가하자면,
*(p.number)과 같은 표기법이 된다.
해석 : 구조체 p의 멤버 number가 가리키는 것을 참조하라는 의미이다.
이때 number가 꼭 포인터여야 한다. number가 포인터가 아니라면 오류이다.
4. *p -> number
순서 : 여기서는 ->(간접 멤버) 연산자가 *(간접 참조) 연산자보다 우선순위가 높다.
위의 문장의 우선순위를 확실히 하기 위해서 ()를 추가하자면,
*(p->number)과 같은 표기법이 된다.
해석 : p가 가리키는 구조체의 멤버 number가 가리키는 내용을 참조한다 라는 의미이다.
-
위의 내용들을 예제를 통해 알아보는데,
구조체를 가리키는 포인터의 예제 구조체(7-1)부터 차근차근 봐보자.
'시작하지 말았어야 했던 것 > C언어 기본 문법' 카테고리의 다른 글
구조체(7-3) 포인터를 멤버로 가지는 구조체 (0) | 2021.02.06 |
---|---|
구조체(7-2)구조체를 가리키는 포인터 예제 (6) | 2021.02.06 |
구조체(6-1) 구조체의 배열 예제 (0) | 2021.02.06 |
구조체(6) 구조체의 배열 (0) | 2021.02.06 |
구조체(5) 구조체 변수의 대입과 비교 (0) | 2021.02.06 |