Function(함수)

1.
함수를 쓰는 이유는 반복되는 코드의 사용을 줄이기 위해서이다.
2. 사용자 정의 연산
ex) Power(2, 3);

3. 추상화, 모듈화

---

함수 인자 전달

int a = 100;
int b = 200;
int tmp = a;
a = b;
b = tmp;
=>
void swap(int* pa, int* pb)
{
 int tmp = *pa;
 *pa = *pb;
 *pb = tmp;
}

---

c언어에는 call by reference가 없다. call by value밖에 없다.

---

배열을 인자로 전달할 때
첫번째 요소의 주소와 size를 전달한다.

int nums[] = {1, 2, 3, 4, 5};
int sum;
sum = sumArray(nums); == sumArray(&nums[0]);

int sumArray(const int* pArr) { => const 쓸지 안쓸지 고민하고 쓸 수 있으면 써줘라.
 int sum = 0;
 for(i = 0; i < 5; ++i) { // 크기가 5인 배열밖에 계산하지 못한다.
  sum = sum + pArr[i];
 }
 return sum;
}

int nums[] = {1, 2, 3, 4, 5};
int sum;
sum = sumArray(nums, 5); == sumArray(&nums[0]);

int sumArray(const int* pArr, int size) { => const 쓸지 안쓸지 고민
 int sum = 0;
 for(i = 0; i < size; ++i) { // 인자로 size를 받아 다양한 크기의 배열을 계산할 수 있다.
  sum = sum + pArr[i];
 }
 return sum;
}


---

int nums[] = {1, 2, 3, 4, 5};
int sum;

sum = sumArray(nums);

int sumArray(int arr[]) { => int sumArray(int* arr)
 int sum;
 for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i) {
  sum += arr[i];
 }
}

int nums[] = {1, 2, 3, 4, 5};
int sum;

sum = sumArray(nums, sizeof(nums)/sizeof(nums[0])); // 크기에 그냥 5 써줘라

int sumArray(int arr[], int size) { => int sumArray(int* arr)
 int sum;
for(int i = 0; i < size; ++i) {
  sum += arr[i];
 }
}

---

int matrix[][4] = {
 {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}
};

re = sumMatrix(matrix, 3, 4); => sumMatrix(&matrix[0], 3, 4);

int sumMatrix(const int (*m)[4], int row, int col) {
 int sum = 0;
 for(int i = 0; i < row; ++i)
  for(int j = 0; j < col; ++j)
   sum += m[i][j];
 return sum;
}

---

구조체(structure) 자료를 입력으로 전달할 때 오버헤드를 줄이기 위해서 포인터를 쓴다.

typedef struct {
 int year;
 int month;
 int day;
} Date;

Date today;
today.year = 2019;
today.month = 7;
today.day = 17;

Date d;
d = today;
---
printDate(today);

void printDate(Date d)
{
 printf("%d %d %d\n", d.year, d.month, d.day);
}

printDate(&today); // 오버헤드를 줄여주기 위해서 주소값을 넘겨준다.

void printDate(const Date* pd)
{
 printf("%d %d %d\n", (*pd).year, (*pd).month, (*pd).day);
 == 
 printf("%d %d %d\n", pd->year, pd->month, pd->day);
}

---

사용자 정의 연산(= 함수)를 인자로 전달할 때 함수 포인터를 쓴다.

---

임의의 인자를 전달할 때 void*를 쓴다.

---

Comments