본문 바로가기
코스웨어/10년 시스템제어

3월 26일 (금) 시스템제어 - 김락영(3번) 업무일지

by 알 수 없는 사용자 2010. 3. 27.
728x90
반응형

<스택구조 복습> 

#include
 <stdio.h>

void test1 (intint);
void test2 (intintint);

int main()
{
  int iNum1 = 100;
  int iNum2 = 200;
  test1(1,2);
  test2(3,4,5);

  return 0;
}

void test1 (int iNum1, int iNum2)
{
  int *p = 0;
  fprintf(stdout,"test1\n");
}

void test2 (int iNum1, int iNum2, int iNum3)
{
  int *p = 0;
  fprintf(stdout,"test2\n");
}


※함수 호출(stack operation)로 인해 ESP가 4Btyes씩 아래로 이동한다. 
 ※stack  영역 : EBP - ESP 사이

- ESP는 필요할 때마다 main stack의 공간을 늘였다 줄였다 할 수 있다.

- test1이 쓰던 공간을 test2가 덮어쓴다. 그러므로 test1은 보호되지 않는다.
: 호출을 많이 하면 값을 유지할 수 없다.
































<수학함수>


<math.h>헤더파일 내의 수학관련 함수

 함수 설명 
 double sqrt(double x) 제곱근 
 double log(double x) Loge(x) 
 double log10(double x) Log10(x) 
 double pow(double x, double y) x의 y승 
 double ceil(double x) x보다 큰 가장 작은 정수 
 double floor(double x) x보다 적은 가장 큰 정수 
 int abs(int x) 절대값 



<함수 포인터>

함수 포인터는 함수의 실행코드의 시작주소를 가지고 있으며, 이를 이용하여 함수를 호출
할 수 있다. 배열 이름이 메모리 주소값을 가지는 상수 이듯이, 함수 이름도 함수의 시작
코드의 주소값을 가지는 주소값 상수이다.

반환자료형 (* 함수포인터 변수 이름) (인수1, 인수2....., 인수n);



ex) 함수 포인터의 사용
#include<stdio.h>

int
 plus(intint);
int minus(intint);

int main()
{
  char op;
  int num1, num2;
  int (*handler)(intint); // 함수 포인터의 선언

  fprintf(stdout,"Please Enter operator <'+' or '-'>");
  fscanf(stdin, "%c"&op);
  
  if(op=='+'
  {
    handler=plus;
  }
  if(op=='-')
  {
    handler=minus;
  }

  fprintf(stdout,"Enter the first operand : ");
  fscanf(stdin,"%d"&num1);
  fprintf(stdout,"Enter the second operand : ");
  fscanf(stdin, "%d"&num2);
  fprintf(stdout,"the result is %d.\n", (handler)(num1, num2));
  
  return 0;

}

int plus(int a, int b)
{
  return (a+b);
}

int minus(int a, int b)
{
  return  (a-b);
}







<배열>

배열이란? 의미상 연관이 있는 동일한 자료형에 속한 여러 개의 자료들을 묶어
하나의 이름으로 정의한 자료형이다.
배열의 선언 형식은 다음과 같다.

자료형 배열이름[크기]

만약 int score[50] 이라는 배열을 선언하였다면...

             
    score[0]                 score[1]          score[2]               . . . . . . . . . . . . . . . . .             score[48]         score[49]
--> 배열의 인덱스는 항상 [0]부터 시작하고, 이 주소가 배열의 시작주소이다.


ex1) 10명 학생의 시험 성적의 평균값을 배열을 사용해서 계산하는 프로그램




<배열의 초기화>

배열도 선언과 동시에 초기화 할 수 있다. 초기화 시 중괄호를 이용한다.

초기화 예)
int rose[5]={78, 97, 56, 84, 66}     -->다섯개 인덱스 모두 초기화 됨.
int rose[]={78, 97, 56, 84, 66, 43}  --> 배열의 크기가 생략되었지만, 컴파일러가 스스로 초기값의
                                                     개수만큼 크기를 초기화 해준다.
int rose[5] ={78, 97, 56,, }            --> 초기값이 명시되지 않은 인덱스에는 0으로 초기화 된다.



<배열과 포인터>

포인터와 배열이름의 차이: 포인터는 메모리의 주소를 값으로 가지는 변수로 그 주소를 이용해서
메모리에 접근한다. 반면 배열이름은 그 배열에 할당된 메모리의 시작주소를 나타내는 상수이므로
배열이 가리키는 주소는 변하지 않는다.


다음 그림은 포인터와 배열의 가장 기초적 관계를 보여준다.


먼저 iaNum[5]라는 배열이 선언되었다. 그리고 그 배열을 포인터 처럼 활용하고 있는 것을 볼
수 있다. 어디에도 iaNum이라는 포인터를 선언한 적이 없는데 말이다....
결국 배열을 포인터처럼 사용할 수 있다는 것이다. 왜??? 포인터나 배열이름이나 둘 다 주소값
을 가지는 것들이기 때문이다.



##### 배열은 인덱스[0]부터 끝까지 차례대로 공간을 할당하고, 그 공간에 값이 저장될 때는 역순으로
해당 번지에 저장된다.

int iaNum[5]={0, 1, 2, 3, 4}   라는 배열을 선언하였다고 가정하면.....

iaNum[0]이 배열의 시작 주소(배열이름) 로서 처음 만들어지고 iaNum[1], iaNum[2,], iaNum[3], iaNum[4]
의 공간이 만들어지게 된다.  각 인덱스별로 저장 공간이 다 확보 된 후에는 역순으로 각 인덱스의 주소에
값이 저장된다.   이 설명을 그림으로 표현하면 아래와 같다.


728x90