자동변수(지역변수)
- 하나의 함수 내부에 선언한 변수
- 변수의 기억공간이 할당되는 시점은 각 변수가 속해 있는 함수가 호출되어 실행될 때이다
예제)13-1
메인함수에서 두 수를 입력받아 곱하는 프로그램
곱하는 작업은 리턴값이 없는 함수를 이용
void func(int *, int *, int *); //함수선언
int main(){
int a, b, c;
printf("두 수를 입력하세요");
scanf_s("%d %d", &a, &b);
func(&a, &b, &c);
printf("%d", c);
return 0;
}
void func(int* a, int* b, int* c){
*c = (*a)*(*b); //두 변수 a,b를 곱한 값을 c에 대입한다.
}
결과)
정적변수
- 기억공간의 생성과 초기화가 함수의 호출 횟수에 영향을 받지 않는 변수
- 선언 방법 ex) static int sum;
예제)13-2
메인에서 배열요소값 출력하는 프로그램
함수가 호출될 때마다 배열요소값 차례로 리턴하는 함수 이용
int* func(); //함수 선언
int main(){
int i;
int* p;
for (i = 0; i < 5; i++){
p = func(); //함수 대입
printf("%d번째 배열 요소 : %d\n",(i+1), *p); //배열 출력
}
return 0;
}
int* func(){
int array[] = { 1, 2, 3, 4, 5 };
static int sum = 0; //정적변수 선언
sum++;
return &array[sum-1]; //배열에 저장된 값 리턴
}
결과)
외부변수
- 변수를 함수 밖에서 선언한다.
예제)13-3
get_next 함수 : 현재 배열 요소의 값을 리턴하고 다음 배열 요소로 이동
get_before 함수 : 현재 배열 요소의 값을 리턴하고 이전 배열 요소로 이동
#include <stdio.h>
int array[] = { 1, 2, 3, 4, 5 }; //배열 선언
int get_next(); //함수 선언
int get_before(); //함수 선언
static int sum = 0; //외부변수 선언
int main(){
printf("next함수 호출 : %d\n",get_next());
printf("next함수 호출 : %d\n", get_next());
sum++;
printf("before함수 호출 : %d\n", get_before());
printf("before함수 호출 : %d\n", get_before());
return 0;
}
int get_next(){
sum++; //배열 인덱스 증가
return array[sum-1];
}
int get_before(){
sum--; //배열 인덱스 감소
return array[sum];
}
결과)
포인터 배열
- 포인터변수들로 만들어진 배열(문자열 상수)
예제)14-4
포인터배열을 사용해 가장 긴 단어 출력하기
#include <string.h>
int main(){
char* array[] = { "dog", "elephant", "monkey", "rabbit", "tiger" }; //포인터배열 선언
int i, j;
char* max = array[0];
for (i = 0; i < 5; i++){ //max보다 길이가 긴 배열요소를 max에 대입한다.
if (strlen(array[i]) > strlen(max)) max = array[i]; //strlen() : 문자열 사이즈 측정함수
}
printf(max);
printf("\n");
return 0;
}
결과)