카테고리 없음

C언어 스터디 4주차

Yeni_aa 2022. 3. 26. 04:02

 


36. 배열을 매개변수로 넘기기

1) 배열을 매개 변수로 넘겨봅시다. 

#include <stdio.h>
//array가 전역변수로 설정되지 않아야 하고 , 매개변수로 array넘겨주고 싶을 때
void printArr(int arr[4) {
	for (int i = 0; i < 4; i++) {
		print("%d", arr[i]);
	}
}

int main() {
	int arr[4] = { 1,2,3,4 };

	printArr(arr);

}

call-by-value: 값만 전달하기 (함수안에서 뭔 짓을 해도 진짜 배열은 변함 없음)

call-by-reference: 참조 (넘겨줬을 때 배열 원소 자체를 바꿀 수 있는)

그런데 위의 코드는 call-by-reference이다. 따라서 void printArr(int [4])에서 int[4]는 포인터와 같은 역할이다.

→ int arr[4] == int *arr 

참고) arr == &arr[0]

 

 

2) 이차원 배열을 매개변수로 넘길 때

#include <stdio.h>
//array가 전역변수로 설정되지 않아야 하고 , 매개변수로 array넘겨주고 싶을 때
void printArr(int arr[2][3]) { // int (*arr)[3]
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++) {
			print("%d", arr[i][j]);
		}
		
	}
}

int main() {
	int arr[2][3] = { {1,2,3},{4,5,6}};

	printArr(arr);

}

이차원배열에서도 배열 포인터를 사용해 매개변수로 넘겨줄 수 있다. 

→ 그냥 이차원 배열 형태로 넘겨줘도 된다. 

여기서 arr[2][3] == (*arr)[3] 은 같은 표현입니다.

 

위의 코드 역시 call-by-reference

 


37. 함수 종합문제 

1. 정수 하나를 매개변수로 받아 그 수가 짝수이면 0 아니면 1을 반환하는 함수를 만들어보세요. 

#include <stdio.h>
int parity(int n) {
	if (n % 2 == 0) {
		return 0;
	}
	else {
		return 1;
	}
}

int main() {
	print("%d\n", parity(5));
}

4. 문자열을 매개변수로 받아 그 문자열에서 공백을 제거하여 출력하는 함수를 작성해보자.

 

str[i] != '\0';  Null문자가 아닐 동안은 계속 for문이 반복되도록 만드는 식 

#include <stdio.h>
void print_noSpace(char str[]) {
	//*str 해도 되고
	for (int i = 0; str[i] != '\0'; i++) {
		if (str[i] != ' ')
			print("%c", str[i]);
	}
}

int main() {
	print_noSpace("Hello, World");
}

 

 

 

 


 

38. 구조체

// type define 하는 것 = 형을 정의한다.  = typedef

긴 형을 간편하게 줄이고 싶을 때, 우리가 스스로 이름을 붙일 수 있다. (typedef로)

 

#include <stdio.h>

int main() {
	typedef int Int32; //int 형을 Int32라고 정의내렸다. 
	//기존의 자료형에 별명을 붙여주는 것 같다. 

	Int32 n = 20;

	print("%d\n", n);
}

typedef를 사용해보자 

#include <stdio.h>

int main() {
	typedef int Pair[2];
	Pair point = { 3,4 }; // int point[2] = {3,4};
}

 

 

 


 

39. 구조체를 만들어보자 

★typedef int Pare[2];

 

★Pare p; 라는 말은 int p[2]와 같은말 이었다!! 

 

구조체는 

typedef struct {int x,y ;} Pair;



Pare p;

p.x= 3

p.y =4

위의 코드처럼 간단히 살펴볼 수 있다. 아래의 코드를 보며 구조체를 잘 이해해보자. 

x,y의 설정값을 사람들에게 설명하지 않아도, 누구나 쉽게 이해하기 쉽도록만드는 것!

 

#include <stdio.h>

int main() {
	struct { int x, y; } Point; //구조체 struct
	Point p;
	
    p.x = 3;
	p.y = 4;


}

참고로 구조체는 전역변수로 많이 빼주는 편이다. 함수 밖으로 빼주어도 됨. 

 

 

40. 구조체와 메모리

#include <stdio.h>

int main() {
	struct Point {
		int x, y;
		char c;
		double d;
	//구조체 안에 아무 변수나 선언하면 됨.
	};
	Point p;
	

}

자 그럼 윗 내용을 바탕으로 구조체 안에 제품 정보를 저장해보자.

#include <stdio.h>

struct ProductInfo //ProductInfo라는 구조체를 선언 
{
	int num; //상품번호
	char name[100]; //제품명
	int cost; //가격을 저장하는 구조체 

};

int main() {
	ProtuctInfo myProduct = { 479412, "제주한라봉", 19000 };

 

41. 구조체 가리키기

구조체 포인터란? 구조체를 가리키는 포인터이다. 일반 int형 변수 char형 변수 포인터와 다를 바 없음. 

#include <stdio.h>

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

};

int main() {
	ProductInfo myProduct { 479412, "제주한라봉", 19000 };

	ProductInfo* ptr_product = &myProduct;

	printf("상품번호: %d\n", (*ptr_product).num);  //*ptr_product.num하면 오류납니다! 

}
더보기

★ (*ptr_product).num == ptr_pruduct->num

구조체 포인터 ptr_product가 작성하기 번거롭다면  오른쪽과 같은 방법으로 작성해도 무방하다. 두 표현은 같은 표현임. 

 

 

 

42. 구조체에 함수 집어넣기 

#include <stdio.h>

struct Time
{
	int h, m, s;
};

int totalSec(Time t) {

	return 3600 * t.h + 60 * t.m + t.s;
}

int main() {
	Time t = {1, 22 48}
}

위의 코드는 구조체와 함수, 메인함수가 세가지로 나눠 작성된 예시입니다. 구조체가 밖의 함수와 밀접한 관련이 있다면 구조체 안에 함수를 넣어주는 것이 편리합니다. 

#include <stdio.h>

struct Time
{
	int h, m, s;

	int totalSec() {
		3600 * h + 60 * m + s;
	}
}; //Time이라는 구조체에 member함수를 집어넣을 수 있고
//member함수 안에서는 구조체 변수들을 자유롭게 사용이 가능하다. 


int main() {
	Time t = { 1, 22 48 };
	printf("%d", t.totalSec()); //t.totalSec()는 구조체 안에 member 함수 
}

t.totalSec()구조체 안에 member method == member 함수라는 의미이다. 

Time이라는 구조체 안에 member함수를 집어넣을 수 있고,

member함수 안에서는 구조체 변수들이 자유롭게 사용이 가능합니다. EX) t.f t.m이런 선언 없이. 

 

44. 상수 만들기 

//상수: 변하지 않는 수라는 뜻

상수를 만드는 방법: const, 매크로, enum 

 

//변수: 변하는 수 

ex) int a =2;

a=4;

 

1) const: const가 붙은 변수는 더이상 변수가 아니고 상수가 된다. 

#include <stdio.h>


int main() {
	const float pi = 3.141592;
	//const를 붙이면 어떻게 되나??
	//pi라는 변수는 더이상 변수가 아니고 상수입니다.
	float a = pi;

	//float pi *= 2 와 같은 문장은 실행이 안됨. pi가 상수니까 

}

2) 매크로란? #define으로 정의하는 것. 별칭을 지어주는 느낌이라 생각하면 쉬움. 

#include <stdio.h>
#define PI 3.142592

int main() {
	//define이 하는 일은 
	//별칭을 PI라고 지어주고, 컴퓨터가 알아서 PI를 3.141592로 바꾸게 하자
	float a = PI;

	//불가능: printf("&PI = %d\n", &PI)

	

}

3) enum이란? 자동으로 순서를 매겨주며, ','으로 연결 시켜줘야 함.

 

#include <stdio.h>

enum EGameState {
	 GAMESTATE_MAINMENU,
	 GAMESTATE_PLAYING,
	 GAMESTATE_PAUSED,
	 GAMESTATE_OVER 
};
//enum은 자동으로 순서 매겨줌, 그리고 ,로 연결시켜줌