13장 변수의 영역과 데이터 공유
연습문제1
1. 3,4,5,6번
2. 30
3. static
4. 20
5
#include<stdio.h>
double get_next();
double ary[] = { 0.1, 0.3, 0.5, 0.7, 0.9 };
int main()
{
double res = 0;
int i,size;
size = sizeof(ary)/sizeof(ary[0]);
for (i = 0; i < size; i++)
{
res += get_next();
}
printf("%.1lf\n", res);
return 0;
}
double get_next()
{
static int index;
double num;
num = ary[index];
index++;
return num;
}
연습문제2
1. 1번-주소를 전달하는 방법 2번- 값을 복사해서 전달하는 방법, 3번-주소를 반환하는 함수
2. 지역변수 n 의 주소를 반환해서 에러!
3. *pr=*pa+*pb;
4.
#include<stdio.h>
int quot(int a, int b, int *p);
int main()
{
int a, b, res;
printf("두 정수 입력: ");
scanf("%d%d", &a, &b);
if (quot(a,b,&res)==-1)
{
printf("0으로 나눌 수 없습니다!\n");
}
else
{
printf("%d를 %d로 나눈 몫은 %d입니다\n", a, b, res);
}
return 0;
}
int quot(int a, int b, int *p)
{
if (b == 0)
{
return -1;
}
else
{
*p = a / b;
return 1;
}
}
5. 값을 바꿔야하는데 주소만 바꿔서 값 자체는 바뀌지 않았다.
도전문제1
#include<stdio.h>
void input_data(int *pa, int *pb);
void swap_data();
void print_data(int a, int b);
int a, b;
int main()
{
input_data(&a, &b);
swap_data();
print_data(a,b);
return 0;
}
void input_data(int *pa, int *pb)
{
printf("두 정수 입력: ");
scanf("%d %d", pa, pb);
}
void swap_data()
{
int temp;
temp = a;
a = b;
b = temp;
}
void print_data(int a, int b)
{
printf("두 정수 출력: %d %d\n",a,b);
}
도전문제2
#include <stdio.h>
void set(int h, int m);
void show();
void move();
int hour, min;
int main()
{
int h, m, cnt, i;
printf("최초 시간과 분 입력(24시간) : ");
scanf("%d %d", &h, &m);
hour = h;
min = m;
set(h, m);
printf("경과 시간 입력(분) : ");
scanf("%d", &cnt);
for (i = 0; i<cnt; i++)
{
move();
}
show();
}
void set(int h, int m)
{
if (0 <= h && h<12)
printf("설정된 시간 : %02d:%02d(AM)\n", h, m);
else if (12 <= h && 23 >= h)
printf("설정된 시간 : %02d:%02d(PM)\n", h, m);
}
void move()
{
min++;
if (min == 60)
{
hour++;
if (hour == 24) hour = 0;
min = 0;
}
}
void show()
{
if (0 <= hour && hour < 12)
printf("현재 시간 : %02d:%02d(AM)\n", hour, min);
else if (12 <= hour && 23 >= hour)
printf("현재 시간 : %02d:%02d(PM)\n", hour, min);
}
도전문제3
#include <stdio.h>
char *my_token(char *ps);
int main()
{
char str[80];
char *p;
printf("문장 입력: ");
gets(str);
while ((p = my_token(str)) != NULL)
printf("%s\n", p);
return 0;
}
char *my_token(char *ps)
{
static char *next;
static int finish = 0;
char *temp, *start;
if (finish == 1) return '\0';
if (next == '\0') start = ps;
else start = next + 1;
temp = start;
while ((*temp != ' ') && (*temp != '\0'))
temp++;
if (*temp == '\0') finish = 1;
else *temp = '\0';
next = temp;
return start;
}
추가문제
1.
|
자동(지역)변수 |
외부(전역)변수 |
정적자동변수 |
정적외부변수 |
선언위치 |
함수 내부 (블록 내부) |
함수 밖에서 선언 |
함수 내부 (블록 내부) |
함수 밖에서 선언 |
생존주기 |
함수가 시작할 때 메모리에 할당되고, 종료 시 회수되어 재활용 됨. |
프로그램이 시작할 때 메모리에 할당되고, 끝날 때까지 존재. |
프로그램이 시작할 때 메모리에 할당, 끝날 때까지 존재 |
프로그램 시작할 때 메모리에 할당, 끝날 때까지 존재. |
접근범위 |
선언된 함수 |
프로그램 전체, 어느 함수라도 사용가능 |
블록 내부 |
선언된 파일 내에 모든 함수에서 접근가능 |
자동초기화 여부 |
X |
O |
O |
O |
초기값 |
쓰레기 값 |
0(zero) |
0(zero) |
0(zero) |
장단점 |
-메모리 효율적 사용 -함수의 독립성 증가시키고 디버깅 효율 증가. -쓰레기 값이 저장될 수 있고, 두 개 이상의 함수에서 데이터를 공유하기가 쉽지 않음. |
-프로그래밍이 간편. -프로그램 종료까지 메모리 유지 -소스 사이의 종속성 증가로 인해 수정이 힘들고 디버깅 까다로움 |
-함수가 반환되더라도 저장 공간이 계속 유지되므로 함수에 필요한 값 보관가능. -프로그램이 끝날 때까지 저장 공간을 유지하며 특정 함수에만 쓰는 경우에 유용. -사용범위 제한되어 선언된 지역 내에서만 접근 가능하므로 다른 함수의 접근 차단하여 전역변수 단점 해결
|
|
-사용범위가 블록내부로 제한되어 다른 함수의 접근을 차단함. |
-전역 변수와 달리 외부 소스에서 이 변수를 사용할 수 없음. |
2. 값에 의한 호출과 주소에 의한 호출을 설명하시오.
-값에 의한 호출: 호출할 때 변수의 값을 복사하여 인수로 준다. 저장 공간이 별도로 할당되어 저장되므로 값을 출력하는 경우, 연산하는 경우 등 호출된 함수의 변수 값을 변경하지 않아도 될 때 사용.
-주소에 의한 호출: 포인터 사용하여 변수의 주소를 넘기는 방법으로 하나의 저장 공간을 공유한다. 따라서 호출된 함수의 변수 값을 변경할 수 있다.
3.주소에 의한 호출을 사용해야하는 예를 설명하시오
CASE01.
호출한 함수에 있는 변수값을 바꿔야하는 경우 ‘값에 의한 호출’은 값이 바뀌지 않으므로(저장 공간이 독립적이어서 영향 없음) 포인터 사용하는 주소에 의한 호출을 사용해야한다.
함수예시)
#include<stdio.h>
void data_input(int *pa, int *pb);
int main()
{
int a, b;
data_input(&a, &b);
printf("입력된 값 a: %d, b: %d\n", a, b);
return 0;
}
void data_input(int *pa, int *pb)
{
printf("두 정수 입력: ");
scanf("%d %d", pa, pb);
}
CASE02.
함수의 리턴값이 2개 이상일 때
함수예시)
#include<stdio.h>
void input_data(int *px);
void get_minmax(int a, int b, int *pmax, int *pmin);
int main()
{
int a,b;
int max, min;
input_data(&a);
input_data(&b);
get_minmax(a,b,&max, &min);
printf("최댓값:%d,최솟값:%d\n", max, min);
return 0;
}
void input_data(int *px)
{
printf("정수 입력: ");
scanf("%d", px);
}
void get_minmax(int a,int b, int *pmax, int *pmin)
{
if (a > b)
{
*pmax = a;
*pmin = b;
}
else
{
*pmin = a;
*pmax = b;
}
}
CASE03.
매개변수를 배열로 선언할 때
함수예시)
#include<stdio.h>
void data_input(int *pa);
int get_max(int *pa);
int get_min(int *pa);
int main()
{
int ary[5];
int max, min;
data_input(ary);
max = get_max(ary);
min = get_min(ary);
printf("최댓값:%d, 최솟값:%d\n", max, min);
return 0;
}
void data_input(int *pa)
{
int i;
for (i = 0; i < 5; i++)
{
printf("정수 입력: ");
scanf("%d", pa+i);
}
}
int get_max(int *pa)
{
int i;
int max = *pa;
for (i = 1; i < 5; i++)
{
if (max < *(pa+i)) max = *(pa+i);
}
return max;
}
int get_min(int *pa)
{
int i, min = *pa;
for (i = 1; i < 5; i++)
{
if (min > *(pa + i)) min = *(pa + i);
}
return min;
}
'programming > c,c++' 카테고리의 다른 글
이것이 C언어다::17장 (0) | 2020.03.26 |
---|---|
이것이 C언어다::16장 (0) | 2020.03.26 |
이것이 C언어다::12장 (0) | 2020.03.26 |
이것이 C언어다::11장 (0) | 2020.03.26 |
피드백)이것이C언어다::10장 (0) | 2020.03.26 |