[211104] 교육 4일차

oxllz·2022년 1월 21일
0

교육

목록 보기
4/41
컴파일 : [경로] 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;
}

정수값을 실수형 변수에 대입하면 형 변환되어 대입된다.
실수값을 정수형 변수에 대입하면 소수점 아래는 생략하여 대입된다.

  • java 의 경우에는 큰 타입에서 작은 타입의 자동형변환은 불가능했다.

// 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 포인터가 가리키는 공간

  • int i; - int 형 값을 하나 보관 가능한 ( 넣을 수 있는 ) 변수를 선언한 것
  • int* i; - int 형 기억공간을 가리킬 수 있는 변수를 선언한 것

메모리를 확보하는 방법

  • 변수 선언
    • 변수명을 통해 접근
  • malloc 호출
    • malloc 호출하는 시점에 할당되고 , 자동삭제 같은거 없고 , free( ) 호출할 때 삭제된다.
    • malloc 으로 확보된 공간은 이름이 없다. 포인터를 통해 접근한다.
#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이 출력된다.

0개의 댓글