728x90
반응형
매개변수 사이의 자료전달 방법
- 값에 의한 자료 전달(call by value)
-> 기본적인 자료 전달 방법
-> 실 매개변수와 형식 매개변수 사이에 값의 전달
-> 호출한 함수의 실행이 끝난 다음 전달받은 값을 되돌려 받지는 못한다 - 참조에 의한 자료전달(call by reference)
- 호출함수와 피호풀함수의 매개변수 값을 서로 교환할 수 있음
- 값을 전달하는 것이 아니라 실 매개변수 값의 주소 값이 전달된다
값에 의한 자료 전달 방법 예
#include <stdio.h>
void swap(int a, int b);
int main(void) {
int x, y;
x = 10;
y = 20;
swap(x, y);
printf("함수 호출 후 x=%d, y=%d", x, y);
}
// a와 b의 숫자를 서로 변경하는 함수
void swap(int a, int b){
int temp;
temp= a;
a = b;
b = temp;
printf("함수 내의 x=%d, y=%d\n", a, b);
}
> 값으로만 자료를 전달하면 전달받은 함수 내에서 새로운 주소의 기억 공간을 할당받아 값을 사용 후 사라짐
참조에 의한 자료전달 방법
fcn1(&a, &b); -> 함수호출(실 매개변수)
& : 주소 연산자 (주소 값을 전달)
int fcn1(int *x, int *y) -> 함수정의(형식 매개변수)
* : 주소의 내용을 다루는 연산자 (전달 받은 주소값과 내용을 가지고 있음)
참조에 의한 자료전달 방법 예
#include <stdio.h>
void swap(int *a, int *b);
int main(void) {
int x, y;
x = 10;
y = 20;
swap(&x, &y);
printf("함수 호출 후 x=%d, y=%d", x, y);
}
// a와 b의 숫자를 서로 변경하는 함수
void swap(int *a, int *b){
int temp;
temp= *a;
*a = *b;
*b = temp;
printf("함수 내의 x=%d, y=%d\n", *a, *b);
}
-> 참조에 의해 값을 전달하면 참조하는 자료의 주소에 직접 접근하여 내용을 변경하게 된다
기억 클래스
-> 변수를 기억공간의 특정영역에 할당하는 방법
-> 각 변수의 유효범위와 존속기간을 설정
- 변수의 사용 위치에 따른 분류
-> 지역변수, 전역변수 - 변수의 존속기간에 따른 분류
-> 자동변수, 정적변수, 외부변수, 레지스터 변수
지역변수
- 특정 범위 내에서만 통용되는 범수
- 선언된 블록이나 함수 내에서만 사용
- 함수에서 사용되는 매개변수도 해당된다
초기화를 해줘야 제대로 사용 가능
전역변수
- 함수 밖이나 외부파일에서 선언되어 프로그램 전체에서 사용될 수 있음
- 가급적 프로그램 선두에 위치하는 것이 좋다
초기화하지 않을 경우 0으로 자동 초기화 된다
전역변수와 지역변수의 비교
- 동일 범위 내에서는 지역변수가 우선
- 가급적 지역변수를 사용하는 것이 효율적
-> 함수 독립성 향상
-> 디버깅 효율 향상
-> 기억 공간 절약변수의 기억클래스 종류 - 변수의 초기화, 존속기간, 유효범위에 따라 구별
-> 자동 변수 (auto) : 디폴트, 생략 가능
-> 정적 변수 (static)
-> 외부 변수 (extern)
-> 레지스터 변수 (register)
기억클래스를 이용한 변수 선언
- 형식 : 기억클래스 자료형 변수명;
- 기능 : 기존의 변수 선언에 기억클래스를 기입하여 해당 기억영역에 위치시킨다
- 사용 예
: auto int a;
: static int a;
: extertn int a;
: register int a;
자동변수
- 함수 실행시 만들어지고, 실행이 끝나면 기억공간이 제거된다
- 예약어 auto -> 생략 가능
- 통용 범위는 변수가 선언된 블록이나 함수 내로 한정
- 지역변수에 해당
자동변수는 초기화가 필요하다
정적변수
- 기억영역이 프로그램 끝날 때까지 유지된다
- 예약어 static을 사용
- 함수 내에서 사용되더라도 전역 변수로 사용된다
- 변수의 값은 프로그램 실행 중 계속 유지
- 초기화가 없으면 0으로 초기화됨
외부변수
- 함수 외부에서 선언
- 예약어 extern을 사용
- 전역 변수에 해당
- 초기화가 없으면 0으로 초기화됨
- **다른 파일에서 외부변수로 선언된 변수의 값을 참조할 수 있다
-> 다른 파일에서 선언된 전역변수를 현재 파일에서 extern으로 불러와 사용할 수 있음 - **다른 파일에서 외부변수로 선언된 변수의 값을 참조할 수 있다
-> 다른 파일에서 선언된 전역변수를 현재 파일에서 extern으로 불러와 사용할 수 있음
레지스터변수
- CPU 내의 레지스터에 자료를 저장하고자 할 때
- 예약어 regsiter를 사용
- 자동 변수와 동일한 속성
- 프로그램의 실행속도 증가를 목적으로 사용
- **주로 반복분에서 카운터 변수로 사용카운터 변수로 사용
#include <stdio.h>
void swap(int *a, int *b);
int main(void) {
register int i;
int sum = 0;
for (i=0; i<=10; ++i){
sum += i;
}
i -= 1;
printf("i = %d, sum = %d", i ,sum);
}
- foor문의 증감식에서의 ++i와 i++
-> 논리적으로는 ++i가 조금 더 빠르다
-> operator 코드를 보면 ++i는 자기 자신에 바로 +1을 하고 i++는 임시변수를 생성하여 +1을 한다
반응형
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 - 9. 배열과 포인터(2) (0) | 2021.03.17 |
---|---|
C언어 - 8. 배열과 포인터(1) (0) | 2021.03.16 |
C언어 - 6. 함수와 기억클래스(1) (0) | 2021.03.14 |
C언어 - 5. 제어문과 반복문 (0) | 2021.03.10 |
C언어 - 4.입출력 함수와 연산자(2) (0) | 2021.03.10 |
댓글