반응형

 

📝구조체 (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);

	

}
반응형