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은 자동으로 순서 매겨줌, 그리고 ,로 연결시켜줌