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";
-구조체 선언은 주로 헤더 파일에 들어감
-헤더 파일: 구조체 선언, 함수 원형,템플릿 등 포함
motivation
-구조체는 자료형도 각자 다른 멤버가 여러 개 들어 있어서 크기가 꽤 된다. 그래서 구조체 변수를 일일히 선언해 사용하는 것보단, 포인터에 메모리를 할당해 사용하는 방법을 이용한다.
구조체 포인터란?
-여기서, 구조체==int라고 생각하면 된다. int numP처럼, 구조체도 사용자가 정의한 데이터형으로 생각하는 것이다. 데이터형보다는 자료형이 적절한 말이겠지만 일단 이해를 돕기 위해 데이터형으로 생각해 보자.
-즉, 구조체 포인터란, 구조체의 공간을 가리키는 포인터이다.
-변수가 int형이면 그 변수의 메모리 주소를 저장하는 포인터는 int 라야 하는 것처럼,
구조체 변수의 메모리 주소를 저장하는 포인터는 구조체 * 형태일 것이다.
구조체 포인터 선언
-struct 구조체명 *포인터명
동적 메모리 할당
-구조체 포인터에는 malloc이라는 함수를 사용해 동적 메모리를 할당한다.
동적 할당에 대해 이후 좀더 자세히 다루면서 얘기할 것이고, 지금은 일단 그렇구나 하고 넘어가자.
예시)
struct MyStruct *ms=malloc(sizeof(struct MyStruct));
동적 메모리 해제
-free함수를 통해 동적 메모리를 해제해 줘야 한다.
-free(구조체포인터명)
예시)
free(ms);
->
-'->': 구조체 포인터의 멤버에 접근하고 싶을 때
-구조체포인터명->구조체멤버명
예시)
ms->name = "Choi";
*.
-구조체 포인터에서 '.'로 멤버에 접근하기
-(*구조체포인터명).구조체멤버명
예시)
(*ms).name;