컴파일 : [경로] gcc Test028.c -o test.exe
실행 : test.exe
#include <stdio.h> int main() { int i; i = 100; i = i + 1; printf("%d\n" , i ); printf("HelloWorld\n"); // int j; return 0; }
선언하면서 대입하지 않는다
변수 선언은 코드 ( 함수 ) 위쪽으로 몰아서 해 주어야 한다.
#include <stdio.h> int main(){ int i; float j; // i = 100; i = i + 1; printf("%d\n", i ); // 101 // j = 3.1416; printf("%f\n", j ); // 3.141600 // j = i; printf("%f\n", j ); // 101.000000 // i = 3.14; printf("%d\n", i ); // 3 return 0; }
정수값을 실수형 변수에 대입하면 형 변환되어 대입된다.
실수값을 정수형 변수에 대입하면 소수점 아래는 생략하여 대입된다.
// 100만원을 100년간 6.6% 이자로 복리로 굴린 결과는? #include <stdio.h> int main(){ int money; int years; float rate; float total; int i; // money = 100; years = 100; rate = 0.066; // money가 int 형이기때문에 float형 변수에 대입하여 계산해준다 total = money; for( i = 0 ; i < years ; i++ ) { total = total + total * rate; } printf("%f\n", total ); return 0; }
#include <stdio.h> int main() { int l[4]; // 4개의 기억공간 확보. 0 ~ 3 까지 4는 없다. int i; // l[0] = 3; l[1] = 7; l[2] = 9; l[3] = 10; // for( i = 0 ; i < 4 ; i++ ) { printf("%d\n", l[i] ); } // 최대값 구하기 max = l[0]; for(i = 1; i < 4; i++){ if(max < l[i]){ max = l[i]; } } printf("%d\n", max); return 0; }
#include <stdio.h> // add 라는 이름의 함수를 선언 int add( int i, int j ) { return 200; } // int main() { int a; a = add( 10, 20 ); printf( "%d\n", a ); return 0; }
[자료형] 함수이름( 매개변수 ) {
return 값; --> [자료형]을 만족해한다.
}
로컬변수
- 함수가 호출되었을때 메모리를 할당받고, 함수가 호출 종료되면 자동 소거된다.
매개변수
- 변수 선언이라는 건 메모리를 확보하고 이름을 부여하는 것
- 이것이 이루어지는 시점은 함수가 호출되는 시점!!
- 매개변수는 일종의 로컬변수이기 때문에. 함수 호출이 끝나면 매개변수가 확보한 메모리는 사라진다. ( 호출되는 동안만 생겼다 없어진다 )
add( 10, 20 ); - 함수를 호출한 코드
- 호출하기 전에 반드시 선언되어져 있어야 한다.
- 나열된 값은 선언된 매개변수의 갯수와 같아야 하고, 순서대로 대입해야 한다.
- 즉 10은 int i 에 대입 ( int i = 10 ), 20 은 j 에 대입 ( int j = 20 )
- 호출된 함수는 {} 안의 코드를 수행하고, 수행이 끝나면 값을 return 한다.
- 변수 a에 return 한 값을 대입한다.
// // 100만원을 100년간 6.6% 이자로 복리로 굴리는 것을 함수로 구현 #include <stdio.h> float bokri( int money, int years, float rate ) { float total; int i; total = money; for( i = 0 ; i < years ; i++ ) { total = total + total * rate; } return total; } // int main() { float a; a = bokri( 100, 100, 0.066 ); printf("%f\n", a ); return 0; }
#include <stdio.h> int main() { int* i; // (sizeof(int)) : 주어진 크기만큼 메모리를 확보 // i 라는 변수가 확보된 메모리를 가리키게 한다 i = (int*)malloc(sizeof(int)); // i 포인터가 가리키는 기억공간에 100 대입 *i = 100; printf("%d\n", *i ); // i 포인터가 가리키는 공간을 소거 free( i ); return 0; }
*i 는 i 포인터가 가리키는 공간
메모리를 확보하는 방법
#include <stdio.h> int main() { int i; int* p; int* t; i = 100; p = &i; t = p; printf("%d\n" , i ); // 100 printf("%d\n" , *p ); // 100 printf("%d\n" , *t ); // 100 return 0; }
포인터가 기억장소를 가리킬 수 있다면 로컬변수 선언을 통해 확보된 공간도 포인터가 접근 가능한가??
#include <stdio.h> int add( int i, int* j ) { i = i + 1; *j = *j + 1; return 100; } // int main() { int a; int i2, j2; // i2 = 100; j2 = 100; a = add( i2, &j2 ); printf("%d\n", i2 ); // 100 printf("%d\n", j2 ); // 101 return 0; }
왜 i2 의 값은 100 이고, j2 의 값은 101 일까?
i는 i2 의 값을 단순히 대입 받는 것이고, 로컬 변수이기 때문에 함수 호출이 종료되면 값은 사라진다.
int add( int i, int* j ) { ... }
add( i2, &j2 )
위의 코드에서 add의 매개변수로 포인터를 사용하는 것을 알수있다.
j = &j2
j2 라는 이름을 가진 기억공간을 j 로 가리기게 된다. j2의 기억공간에 들어있는 값이 변경되기 때문에 101이 출력된다.