[C 자료구조]포인터와 구조체

maroo·2022년 7월 13일
0
post-custom-banner

CH03을 들어가기 전에, 구조체와 포인터에 대한 이해가 필요하다.
구조체와 포인터에 대해 대충은 알고 있지만 정리할 필요성을 느껴 CH03에 들어가기 전 따로 포스팅을 작성하고자 한다.

포인터

&일반변수

-변수의 주소 알아내기: 앞에 &붙이기
예시)

&val

의 결과는 16진수 주소값

포인터 변수

motivation
어떤 메모리의 주소를 저장하고 싶은데, 주소는 그냥 변수에 저장하지 말고 포인터 변수에 저장하자.

포인터 선언 및 할당
-저장할 주소에 이름을 붙인다.
-선언: 자료형* 포인터변수명
-할당: 포인터변수명=&일반변수명
예시)

int* numP;
int num=10;
numP=#

포인터 사용
-즉, 포인터의 이름==주소
예시)

cout << "*bb의 주소: " << bb << endl;

-*포인터변수명==포인터 변수의 값
예시)

cout << "*bb의 값: " << *bb << endl;

구조체

구조체

motivation
관련 있는 정보들을 하나의 의미로 묶기 위해 사용.
그 관련 있는 정보들이 각기 다른 데이터형일 수 있으므로, 다양한 데이터형이 허용되는 데이터의 집합을 정의한 것
-사용자 정의로 새로운 데이터형을 만드는 것이라고 생각하기.
-구조체 변수를 데이터형처럼 사용함
C.F.배열: 같은 데이터형의 집합

구조체 선언

struct 키워드로 구조체 선언
-구조체에 담긴 내용: {}로 묶어서 정의. {}안에서도 ;를 써야 함

예시)

struct MyStruct 
	{
		string name;
		string position;
		float height;
		float weight;
	};

-이 경우 구조체 변수 선언: struct 구조체명 변수명;

예시)
struct MyStruct ms;

typedef로 구조체 선언 및 별칭생성
-motivation: 구조체 변수 만들 때 매번 struct붙이는 게 귀찮아!
-달라진 점: typedef와 구조체별칭
예시)

typedef struct _MyStruct 
	{
		string name;
		string position;
		float height;
		float weight;
	} MyStruct;

(보통 구조체 별칭에 멀쩡한 이름을 주기 위해, 구조체 이름 앞에 _를 붙이곤 한다)
-이 경우 구조체 변수 선언: 구조체명 변수명;
예시)

MyStruct ms;

-어차피 사용은 별칭으로 할 것이므로, typedef를 이용한 선언의 경우 구조체명을 아예 생략하는 것도 가능하다.
예시)

typedef struct
	{
		string name;
		string position;
		float height;
		float weight;
	} MyStruct;

구조체 멤버 접근

-'.': 일반 구조체의 멤버에 접근하고 싶을 때
-구조체변수명.멤버명

예시)

ms.name = "Choi";

헤더 파일(.h)

-구조체 선언은 주로 헤더 파일에 들어감
-헤더 파일: 구조체 선언, 함수 원형,템플릿 등 포함

구조체 포인터

구조체 포인터

motivation
-구조체는 자료형도 각자 다른 멤버가 여러 개 들어 있어서 크기가 꽤 된다. 그래서 구조체 변수를 일일히 선언해 사용하는 것보단, 포인터에 메모리를 할당해 사용하는 방법을 이용한다.

구조체 포인터란?
-여기서, 구조체==int라고 생각하면 된다. int numP처럼, 구조체도 사용자가 정의한 데이터형으로 생각하는 것이다. 데이터형보다는 자료형이 적절한 말이겠지만 일단 이해를 돕기 위해 데이터형으로 생각해 보자.
-즉, 구조체 포인터란, 구조체의 공간을 가리키는 포인터이다.
-변수가 int형이면 그 변수의 메모리 주소를 저장하는 포인터는 int
라야 하는 것처럼,
구조체 변수의 메모리 주소를 저장하는 포인터는 구조체 * 형태일 것이다.

구조체 포인터 선언
-struct 구조체명 *포인터명

동적 메모리

동적 메모리 할당
-구조체 포인터에는 malloc이라는 함수를 사용해 동적 메모리를 할당한다.
동적 할당에 대해 이후 좀더 자세히 다루면서 얘기할 것이고, 지금은 일단 그렇구나 하고 넘어가자.
예시)

struct MyStruct *ms=malloc(sizeof(struct MyStruct));

동적 메모리 해제
-free함수를 통해 동적 메모리를 해제해 줘야 한다.
-free(구조체포인터명)
예시)

free(ms);

구조체 멤버 접근

->
-'->': 구조체 포인터의 멤버에 접근하고 싶을 때
-구조체포인터명->구조체멤버명
예시)

ms->name = "Choi";

*.
-구조체 포인터에서 '.'로 멤버에 접근하기
-(*구조체포인터명).구조체멤버명
예시)

(*ms).name;
profile
할수이따 ~
post-custom-banner

0개의 댓글