본문 바로가기
개발자

두들낙서 C/C++ 38 ~ 41강 typedef, 구조체 만들기, 구조체와 메모리, 구조체 가리키기(구조체 포인터)

by ⁖⁝‥ 2022. 8. 11.

38강. typedef

1) typedef

int main() {
	int n = 26;
	printf("%d\n", n);
}
int main() {
	typedef int int32;
	int32 n = 26;
	printf("%d\n", n);
}
int main() {
	int point[2] = { 3,4 };
	printf("(%d, %d)\n", point[0], point[1]);
}

 

 

int main() {
	typedef int Pair[2];
	Pair point = { 3,4 };
	printf("(%d, %d)\n", point[0], point[1]);
}

typedef 를 사용하면

int point[2] = { 3 , 4 }; 이거랑 Pair point = { 3 , 4 }; 같은말이 된다.

 

int main() {
	const char* name = "Doodle";

	printf("이름 : %s\n", name);
}

 

 

int main() {
	typedef const char* String;

	String name = "Doodle";//char *name = "Doodle"

	printf("이름 : %s\n", name);
}

39강. 구조체 만들기 struct

int main() {
	typedef int Pair[2];

	Pair p; //int p[2]; 랑 같은말
	p[0] = 3;
	p[1] = 4;
}
int main() {
	typedef struct { int x, y; } Pair;

	Pair p; //int p[2]; 랑 같은말
	p.x = 3;
	p.y = 4;
}
int main() {
	typedef struct { int x, y; } Point;

	Point p;

	p.x = 3;
	p.y = 4;
	printf("(%d, %d)\n", p.x, p.y);
}

typedef를 없애려면 Point 를 앞으로 끌어내야됨

 

int main() {
	struct Point { int x, y; } ;

	Point p;

	p.x = 3;
	p.y = 4;
	printf("(%d, %d)\n", p.x, p.y);
}

 

구조체는 전역변수로 빼주는 편이다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

struct Point { int x, y; };

int main() {
	Point p;
	p.x = 3;
	p.y = 4;
	printf("(%d, %d)\n", p.x, p.y);
}

40강. 구조체와 메모리

struct Point { 
	int x, y; 
	char c;
	double d;
};

구조체 안에서 계속 선언 할 수 있음

struct ProductInfo {
	int num;
	char name[100];
	int cost;
};

int main() {
	ProductInfo myProduct = { 4797283, "제주한라봉", 19900 };
	
	printf("상품 번호: %d\n", myProduct.num);
	printf("상품 이름 : %s\n", myProduct.name);
	printf("상품 가격 : %d원\n", myProduct.cost);
}

 

num 은 4바이트 , name은 100바이트, cost는 4바이트 해서

myProduct는 총 108바이트

sizeof(myProduct) 하면 108 이 나온다.

세가지 변수들의 주소값을 구해보자

 

int main() {
	ProductInfo myProduct = { 4797283, "제주한라봉", 19900 };
	
	printf("상품 번호: %d\n", &myProduct.num);
	printf("상품 이름 : %d\n", myProduct.name);
	printf("상품 가격 : %d\n", &myProduct.cost);
}

 

num, name, cost 가 나란히 붙어있음을 알 수 있다.

064   068     168  그리고 이 전체를 myProduct라고 부른다.

그래서 myProduct 의 주솟값은 num 주솟값이랑 같음.

	printf("상품 번호: %d\n", &myProduct.num);
	printf("상품 이름 : %d\n", myProduct.name);
	printf("상품 가격 : %d\n", &myProduct.cost);
	printf("myProduct 주소: %d\n", &myProduct);

 

 

41강. 구조체 가리키기

구조체를 가리키는 포인터

*ptr_product.num 이렇게 하면 컴퓨터는 *(ptr_product.num) 이렇게 인식한다.

그래서 괄호를 (*ptr_product).num 이렇게 쳐야한다.

struct ProductInfo {
	int num;
	char name[100];
	int cost;
};

int main() {
	ProductInfo myProduct = { 4797283, "제주한라봉", 19900 };
	
	ProductInfo* ptr_product = &myProduct;

	printf("상품 번호: %d\n", (*ptr_product).num);
	printf("상품 이름 : %s\n", (*ptr_product).name);
	printf("상품 가격 : %d원\n", (*ptr_product).cost);
}

 (*ptr_product).num)를 간단하게 ptr_product->num 이렇게 화살표로 써도 된다.

int main() {
	ProductInfo myProduct = { 4797283, "제주한라봉", 19900 };
	
	ProductInfo* ptr_product = &myProduct;

	printf("상품 번호: %d\n", ptr_product->num);
	printf("상품 이름 : %s\n", ptr_product->name);
	printf("상품 가격 : %d원\n", ptr_product->cost);
}

10퍼센트 할인을 해보자

struct ProductInfo {
	int num;
	char name[100];
	int cost;
};

void productSale(ProductInfo p, int percent) {
	p.cost -= p.cost * percent / 100;
}

int main() {
	ProductInfo myProduct = { 4797283, "제주한라봉", 20000 };
	
	productSale(myProduct, 10);

	printf("상품 번호: %d\n", myProduct.num);
	printf("상품 이름 : %s\n", myProduct.name);
	printf("상품 가격 : %d원\n", myProduct.cost);
}

이렇게 하면 반영이 안된다.

왜냐하면 productSale 함수가 call by value 이기 때문이다.

p를 포인터로 바꿔야 된다.

struct ProductInfo {
	int num;
	char name[100];
	int cost;
};

void productSale(ProductInfo *p, int percent) {
	p->cost -= p->cost * percent / 100;
}

int main() {
	ProductInfo myProduct = { 4797283, "제주한라봉", 20000 };
	
	productSale(&myProduct, 10);

	printf("상품 번호: %d\n", myProduct.num);
	printf("상품 이름 : %s\n", myProduct.name);
	printf("상품 가격 : %d원\n", myProduct.cost);
}

결과

한라봉이랑 꿀참외 바꿔치기

struct ProductInfo {
	int num;
	char name[100];
	int cost;
};
void productSwap(ProductInfo* a, ProductInfo* b) {
	ProductInfo tmp = *a;
	*a = *b;
	*b = tmp;
}

int main() {
	ProductInfo myProduct{ 4797283, "제주한라봉", 20000 };
	ProductInfo otherProduct{ 4797284, "성주 꿀참외", 10000 };

	// 두개를 바꿔치기
	productSwap(&myProduct, &otherProduct);

	printf("상품 번호: %d\n", myProduct.num);
	printf("상품 이름 : %s\n", myProduct.name);
	printf("상품 가격 : %d원\n", myProduct.cost);
}

 

반응형

댓글