γμ€μ±μ°μ μ΄ν C νλ‘κ·Έλλ°γ μ μ°Έκ³ νμμ΅λλ€.
γμ€μ±μ°μ μ΄ν C νλ‘κ·Έλλ°γ μ€ ν·κ°λ Έλ λ΄μ©μ μ 리ν©λλ€.
λͺ©μ°¨14-1 ; ν¨μμ μΈμλ‘ λ°°μ΄ μ λ¬νκΈ°
14-1 ; ν¨μμ μΈμλ‘ λ°°μ΄ μ λ¬νκΈ°
μΈμμ λ¬μ κΈ°λ³Έλ°©μμ κ°μ 볡μ¬
"ν¨μ νΈμΆ μ μ λ¬λλ μΈμμ κ°μ 맀κ°λ³μμ 볡μ¬κ° λλ€."
μ¦, 볡μ¬κ° λλ κ² λΏμ΄κΈ°μ ν¨μκ° νΈμΆλκ³ λλ©΄, μ λ¬λλ μΈμμ 맀κ°λ³μλ λ³κ°κ° λ¨.
int SimpleFunc(int num){....}
int main(void){
int age=17;
SimpleFunc(age); // ageμ μ μ₯λ κ°μ΄ 맀κ°λ³μ numμ 볡μ¬λ¨
....
}
μ€μ λ‘ μ λ¬λλ κ²μ ageκ° μλ, ageμ μ μ₯λ κ°! κ·Έλ¦¬κ³ κ·Έ κ°μ΄ 맀κ°λ³μ numμ 볡μ¬λ¨.
λ°°μ΄μ ν¨μμ μΈμλ‘ μ λ¬νλ λ°©μ
λ°°μ΄μ ν΅μ§Έλ‘ μ λ¬νλ κ²μ΄ λΆκ°λ₯νλ,
λ°°μ΄μ μ£Όμ κ°μ μΈμλ‘ μ λ¬ν΄μ μ΄λ₯Ό ν΅ν΄μ μ κ·Όνλλ‘ μ λνλ€.
int arr[3]={1,2,3};
SimpleFunc(arr); // SimpleFunc ν¨μλ₯Ό νΈμΆνλ©΄μ λ°°μ΄ arrμ μ£Όμ κ° μ λ¬
λ°λΌμ SimpleFunc ν¨μμ λ§€κ° λ³μλ intν ν¬μΈν° λ³μλ‘ μ μΈλμ΄μΌ νλ€.
void SimpleFunc(int * param) {....}
λ°°μ΄μ μ£Όμ κ°λ§ μλ€λ©΄ μ΄λμλ λ°°μ΄μ μ κ·Όνμ¬ μ μ₯λ κ°μ μ°Έμ‘°νκ³ λ³κ²½ν μ μλ€.
λ°°μ΄μ ν¨μμ μΈμλ‘ μ λ¬λ°λ ν¨μμ λ λ€λ₯Έ μ μΈ
맀κ°λ³μμ μ μΈμμ, int param[ ]κ³Ό, int *paramμ μμ ν λμΌν μ μΈμ΄λ€.
κ·Έλ°λ° μ μμ μ μΈμ΄, λ°°μ΄μ΄ μΈμλ‘ μ λ¬λλ€λ λλμ λ κ°νκ² μ£Όλ μ μΈμ΄λ€.
λ°λΌμ μΌλ°μ μΌλ‘ λ°°μ΄μ μ£Όμ κ°μ΄ μΈμλ‘ μ λ¬λ λμλ int param[ ] ννμ μ μΈμ μ£Όλ‘ λ§μ΄ μ¬μ©νλ€.
νμ§λ§ μ΄ λμ΄ κ°μ μ μΈμΌλ‘ κ°μ£Όλλ κ²½μ°λ 맀κ°λ³μμ μ μΈμΌλ‘ μ νλλ€.
λ°λΌμ int * ptr = arrλ₯Ό int ptr[] = arrλ‘ λ체ν μ μλ€.
int main(void){
int arr[3] = {1,2,3};
int * ptr = arr; // int ptr[] = arr;λ‘ λ체 λΆκ°λ₯
}
** ν¨μ λ΄μμλ μΈμλ‘ μ λ¬λ λ°°μ΄μ κΈΈμ΄λ₯Ό κ³μ°ν μ μλ€.
λ°°μ΄μ μ£Όμ κ°μ μΈμλ‘ μ λ¬λ°λ 맀κ°λ³μλ ν¬μΈν° λ³μμ΄κΈ° λλ¬Έμ
μ΄λ₯Ό λμμΌλ‘ sizeof μ°μ°μ ν κ²½μ°
λ°°μ΄μ ν¬κΈ°κ° λ°νλμ§ μκ³ ν¬μΈν° λ³μμ ν¬κΈ°κ° λ°νλλ€.
λ°λΌμ λ°°μ΄μ ν¬κΈ°λ κΈΈμ΄ μ 보λ κ³μ°ν΄μ ν¨κ» μΈμλ‘ μ λ¬ν΄μΌ νλ€.
14-2 ; Call-by-value vs. Call-by-reference
ν¨μμ νΈμΆ λ°©μ λ κ°μ§. (ν¨μμ μΈμλ‘ μ λ¬λλ λμμ λ°λΌ ꡬλΆ!)
- ν¨μλ₯Ό νΈμΆν λ λ¨μν κ°μ μ λ¬νλ ννμ ν¨μνΈμΆμ Call-by-value,
- λ©λͺ¨λ¦¬μ μ κ·Όμ μ¬μ©λλ μ£Όμ κ°μ μ λ¬νλ ννμ ν¨μνΈμΆμ Call-by-reference.
κ°μ μ λ¬νλ ννμ ν¨μ νΈμΆ : Call-by-value
#include <stdio.h>
void Swap(int n1, int n2){
int temp=n1;
n1=n2;
n2=temp;
printf("n1 n2: %d %d \n", n1, n2); // 20 10
}
int main(int argc, const char * argv[]) {
int num1 = 10;
int num2 = 20;
printf("num1 num2 : %d %d \n", num1, num2); // 10 20
Swap(num1, num2); // SwapμΌλ‘ num1κ³Ό num2μ μ μ₯λ κ°μ΄ λ°λμ§ μμ.
printf("num1 num2 : %d %d \n", num1, num2); // 10 20
return 0;
}
SwapμΌλ‘ num1κ³Ό num2μ μ μ₯λ κ°μ΄ λ°λμ§ μμ.
λ 맀κ°λ³μ(n1, n2) μ¬μ΄μμλ§ κ°μ λ³νμ΄ μΌμ΄λ¨.
μ£Όμ κ°μ μ λ¬νλ ννμ ν¨μ νΈμΆ : Call-by-reference
#include <stdio.h>
void Swap(int *ptr1, int *ptr2){
int temp=*ptr1;
*ptr1=*ptr2;
*ptr2=temp;
}
int main(int argc, const char * argv[]) {
int num1 = 10;
int num2 = 20;
printf("num1 num2 : %d %d \n", num1, num2);
Swap(&num1, &num2);
printf("num1 num2 : %d %d \n", num1, num2);
return 0;
}
scanf ν¨μ νΈμΆ μ & μ°μ°μλ₯Ό λΆμ΄λ μ΄μ
int num;
scanf("%d", &num); // λ³μ numμ μ£Όμ κ°μ scanf ν¨μμ μ λ¬
scanf ν¨μμ μν : μ¬μ©μλ‘λΆν° κ°μ μ λ ₯ λ°μμ λ³μ numμ κ°μ μ±μ°λ μΌ
λ³μ numμ μ£Όμ κ°μ ν΅ν΄ λ³μ numμ μ κ·Όν΄ κ°μ μ±μ λ£μ !
-> scanf ν¨μμ νΈμΆλ Call-by-reference ννμ ν¨μ νΈμΆ
λ¬Έμ 14-1 [Call-by-value & Call-by-reference]
- λ¬Έμ 1
// λ³μ numμ μ μ₯λ κ°μ μ κ³±μ κ³μ°νλ ν¨μλ₯Ό μ μ
// μ΄λ₯Ό νΈμΆνλ main ν¨μ μμ±
// SquareByvalue ν¨μλ μΈμλ‘ μ λ¬λ κ°μ μ κ³±μ λ°ν
// SquareByReference ν¨μλ μ μκ° μ μ₯λμ΄ μλ λ³μμ μ£Όμ κ°μ μΈμλ‘ λ°μμ, ν΄λΉ λ³μμ μ μ₯λ κ°μ μ κ³±μ κ·Έ λ³μμ λ€μ μ μ₯
#include <stdio.h>
int SquareByValue (int num){
return num = num*num;
}
void SquareByReference (int * num){
*num *= *num;
}
int main(int argc, const char * argv[]) {
int num;
printf("μ μλ₯Ό μ
λ ₯νμμ€: ");
scanf("%d", &num);
printf("SquareByValue: %d\n", SquareByValue(num));
SquareByReference(&num);
printf("SquareByReference: %d\n", num);
return 0;
}
/*
λ΅μ§μ½λ
void SquareByReference(int * ptr){
int num = *ptr;
*ptr = num*num;
*/
- λ¬Έμ 2
// μΈ λ³μμ μ μ₯λ κ°μ μλ‘ λ€λ°κΎΈλ ν¨μ
// ν¨μ νΈμΆ νν : Swap3(&num, &num2, &num3)
// ν¨μ νΈμΆμ κ²°κ³Ό : num1 → num2, num2 → num3, num3 → num1
#include <stdio.h>
void Swap3(int * ptr1, int * ptr2, int * ptr3){
int temp = *ptr1;
*ptr1 = *ptr3;
*ptr3 = *ptr2;
*ptr2 = temp;
}
int main(int argc, const char * argv[]) {
int num1, num2, num3;
printf("μΈ μ μλ₯Ό μ
λ ₯νμμ€: ");
scanf("%d %d %d", &num1, &num2, &num3);
printf("%d %d %d\n", num1, num2, num3);
Swap3(&num1, &num2, &num3);
printf("%d %d %d\n", num1, num2, num3);
return 0;
}
14-3 ; ν¬μΈν° λμμ const μ μΈ
const μ μΈ : λ³μλ₯Ό μμννλ λͺ©μ
ν¬μΈν° λ³μλ₯Ό λμμΌλ‘λ μ μΈμ΄ κ°λ₯ν¨!
: const μ μΈ μμΉλ₯Ό μ£Όμ κΉκ² λ΄μΌ ν¨!
ν¬μΈν° λ³μκ° μ°Έμ‘°νλ λμμ λ³κ²½μ νμ©νμ§ μλ const μ μΈ
int num = 20;
const int * ptr = # // constκ° λ§¨ μ λΆλΆμ μ μΈ
*ptr = 30; // μ»΄νμΌ μλ¬!
num = 40; // μ»΄νμΌ μ±κ³΅!
맨 μλΆλΆμ const μ μ μΈ ->
"ν¬μΈν° λ³μ ptrμ μ΄μ©ν΄μ ptrμ΄ κ°λ¦¬ν€λ λ³μμ μ μ₯λ κ°μ λ³κ²½νλ κ² λΆκ°"
ν¬μΈν° λ³μμ μμν
const μ μΈμ ν¬μΈν° λ³μμ μ΄λ¦ μμ μ¬ μλ μλ€
int num1 = 20;
int num2 = 30;
int * const ptr = &num1; // const κ° ν¬μΈν° λ³μ μμμ μ μΈ
ptr = &num2; // μ»΄νμΌ μλ¬!
*ptr = 40; // μ»΄νμΌ μ±κ³΅!
μμ λ κ°μ§λ₯Ό λμμ
const int * const ptr = #
*ptr = 20; // μ»΄νμΌ μλ¬
ptr = &age; // μ»΄νμΌ μλ¬β
const μ μΈμ΄ κ°λ μλ―Έ
const μ μΈμ λ§μ΄ νλ©΄ κ·Έλ§νΌ νλ‘κ·Έλ¨ μ½λμ μμ μ±μ λμμ§λ€.
ex. μλμ μν©μμ const μ μΈμ΄ μλ€λ©΄ μ€λ₯ λ°κ²¬μ΄ μ΄λ €μ μ§ (μ»΄νμΌλ¬κ° λ¬Έμ μ λ°κ²¬νμ§ λͺ»ν¨)
int main(void){
const double PI = 3.1415;
double rad;
PI = 3.07; // μ»΄νμΌ μ λ°κ²¬λλ μ€λ₯ μν©
printf("circle area %f \n", rad*rad*PI);
return 0;
}
λ¬Έμ 14-2 [const μ μΈμ λν μΆκ°μ μΈ μ΄ν΄]
- λ¬Έμ 1
void ShowAllData(const int * arr, int len){
int i;
for (i=0; i<len; i++)
printf("%d ", arr[i]);
}
λ¬Έμ μμ μ μν ν¨μμ κΈ°λ₯ : μΈμλ‘ μ λ¬λ λ°°μ΄μ μ 체μμλ₯Ό μΆλ ₯
νλ‘κ·Έλλ¨Έκ° μ€μλ‘λΌλ λ°°μ΄μμμ κ°μ λ°κΎΈλ μΌμ μμ΄μΌ νλ€.
- λ¬Έμ 2
void ShowData(const int * ptr){
int * rptr = ptr;
printf("%d \n", *rptr);
*rptr = 20; // κ²½κ³ λ©μμ§
}
int main(void){
int num=10;
int * ptr = #
ShowData(ptr);
return 0;
}
const int * ptr
맀κ°λ³μ ptrμ const μ μΈ μΆκ°.
ShowData λ΄μμ ptrμ ν΅ν΄ ptrμ΄ κ°λ¦¬ν€λ λ³μμ μ μ₯λ κ°μ λ³κ²½μν€μ§ μκ² λ€λ μλ