📝구조체 (struct), typedef(별칭)
#include <stdio.h>
#include <stdlib.h>
typedef struct Point
{
int x;
int y;
} PointAlias;
// typedef struct Point PointAlias; 와 동일한 표현
// struct Point라는 글자를 PointAlias라는 글자로표현하겠다는 의미
int main()
{
struct Point p1;
struct Point p2; // C++은 struct 안 붙혀도 인식한다.
PointAlias p3; // typedef로 별칭을 부여한 이름을 사용한 예제
Point pt = {1, 2}; // pt.x = 1 , pt.y = 2
p1.x = 20;
p1.y = 30;
p2.x = 30;
p2.y = 40;
printf("(%d, %d)\n", p1.x, p1.y); // 20, 30
printf("(%d, %d)\n", p2.x, p2.y); // 30, 40
}
struct 구조체명 {
구조체 내용...
}
위와 같은 구조를 통해 변수를 관련 있는 변수를 하나로 관리할 수 있습니다. 위에서 Point란 x좌표 ,y좌표를 가진 2차원 점의 위치를 의미합니다.
📝 구조체 변수에 접근하기, 구조체 포인터
#include <stdio.h>
#include <stdlib.h>
typedef struct Point
{
int x;
int y;
} Point;
int main()
{
Point pt = {1, 2}; // pt.x = 1 , pt.y = 2
Point* pp = &pt;
// pt의 주소의 x에 접근, pt의 주소의 y에 접근
printf("(%d, %d)\n", pt.x, pt.y); // 1, 2
printf("(%d, %d)\n", (*pp).x, (*pp).y); // 1, 2
// 주소로 참조변수에 접근시 (pp의 주소 즉, pt의 주소) ->로 표현
printf("(%d, %d)\n", pp->x, pp->y); // 1, 2
// 위와 같은 형식으로 pt의 주소에 x 또는 y에 접근할 수 있다.
printf("(%d, %d)\n", (&pt)->x, (&pt)->y); // 1, 2
}
구조체 포인터의 경우 일반 포인터와 동일하게 사용하면 됩니다.
- 구조체명* 포인터변수명 = &구조체 변수명
- (*포인터변수명)을 통해 값을 출력할 수 있으며 → *은 주소값을 실제 값으로 변환
- 포인터변수명->을 통해서도 값을 출력할 수 있습니다. → ->은 주소값을 실제값으로 변환
- (&pt)의 경우도 ->의 역할이 주소값을 실제값으로 변환시키기 때문에 주소값 자체를 저장하고 있는 pp의 경우 그냥 사용하면 값이 출력되지만 pt의 경우 값 그 자체를 저장하고 있지 주소값이 아니기 때문에 &을 이용해 주소로 변환시키고 ->을 통해 실제 값으로 바꿔서 접근이 가능합니다. → 물론 이러한 행위는 의미없긴 합니다. pt.x, pt.y로 바로 접근하면 되기 때문이다
#include <stdio.h>
#include <stdlib.h>
typedef struct Point
{
int x;
int y;
} Point;
int main()
{
Point p1 = { 2, 3 }; // Stack 영역에 저장
Point* p = (Point*)malloc(sizeof(Point)); // Stack영역에 포인터 생성 후 실질적 값은 Heap 영역에 저장
p->x = 2;
p->y = 3;
printf("(%d, %d)\n", p1.x, p1.y); // 2 , 3 출력
printf("(%d, %d)\n", p->x, p->y); // 2 , 3 출력
Point arr[5] = { {1,1}, {2,2} };
Point* arr_p = (Point*)malloc(sizeof(Point) * 2);
// 배열 포인터 접근
arr_p[0].x = 1;
arr_p[0].y = 1;
arr_p[1].x = 2;
arr_p[1].y = 2;
// 포인터로 다음 배열 접근시 + 1 (int만 그런건지 테스트가 필요한 부분이긴 하다.)
printf("arr_p[0].x %d == (arr_p)->x) %d\n",arr_p[0].x, (arr_p)->x);
printf("arr_p[0].y %d == (arr_p)->y) %d\n",arr_p[0].y,(arr_p)->y);
printf("arr_p[1].x %d == (arr_p + 1)->x) %d\n", arr_p[1].x,(arr_p + 1)->x);
printf("arr_p[1].y %d == (arr_p + 1)->y) %d\n", arr_p[1].y,(arr_p + 1)->y);
}
'[C, C++]' 카테고리의 다른 글
[C, C++] 배열, 포인터, 데이터 영역(Heap, Stack), malloc, sizeof, scanf_s (사용자에게 입력 받기) (1) | 2022.10.17 |
---|---|
[C, C++] IF문, FOR문, printf (글자 출력하기) (1) | 2022.10.17 |
[C, C++] Visual Studio community 설치 및 컴파일 해보기 (1) | 2022.10.17 |