728x90
반응형
<스택구조 복습>
#include <stdio.h>
void test1 (int, int);
void test2 (int, int, int);
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(int, int);
int minus(int, int);
int main()
{
char op;
int num1, num2;
int (*handler)(int, int); // 함수 포인터의 선언
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] 이라는 배열을 선언하였다면...
--> 배열의 인덱스는 항상 [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
'코스웨어 > 10년 시스템제어' 카테고리의 다른 글
3 / 31 보 고 서 (연결리스트 2) (1) | 2010.03.31 |
---|---|
소스 인사이트 팁 몇가지^_^ (2) | 2010.03.31 |
시스템 제어 - 김민철 - 일일보고서 (2) | 2010.03.29 |
대학병원 의사들 이야기입니다. (1) | 2010.03.29 |
2010.03.25 시스템 제어 김동수 업무일지#2(메인함수와 재귀함수의 메모리 적재) (0) | 2010.03.26 |
2010.03.25 시스템 제어 김동수 업무일지#1(메인함수와 재귀함수의 메모리 적재) (1) | 2010.03.25 |
진리의 C ? (1) | 2010.03.25 |
시스템제어 3월 24일 업무일지 (1번 강정훈) (1) | 2010.03.24 |