- 메모리 / 주소
- 메모리는 byte 단위로 나누어져 있음
- 각 byte는 고유한 주소를 가짐
변수는 여러 바이트에 저장 > 변수가 저장된 메모리의 시작 주소 = 변수의 주소
- 포인터 변수 : 변수(객체)의 주소를 저장하는 변수
- 포인터 연산자
- 주소 연산자 (&) : &변수명 = 해당 변수의 메모리 주소 반환
- 간접 연산자 (*) : 선언 - 해당 변수가 포인터임을 나타냄 // 사용 - 해당 포인터가 가리키는 주소의 실제 값 (값의 복사본 X)
- 값에 의한 전달 (Call by value)
#include <stdio.h>
void swap(int p, int q) {
printf("Before swap: p = %d, q = %d\n", p, q);
int temp = p;
p = q;
q = temp;
printf("After swap: p = %d, q = %d\n", p, q);
}
int main() {
int i = 10;
int j = 20;
printf("Before swap: i = %d, j = %d\n", i, j);
printf("\n");
swap(i, j);
printf("\n");
printf("After swap: i = %d, j = %d", i, j);
return 0;
}
Before swap: i = 10, j = 20
Before swap: p = 10, q = 20
After swap: p = 20, q = 10
// swap 함수 안에서는 유효
After swap: i = 10, j = 20
// 함수에 값의 복사본이 인수로 전달되었으므로, 함수 밖 변수의 원본은 바뀌지 않음
- 참조에 의한 전달 (Call by reference)
#include <stdio.h>
void swap(int *p, int *q) { // 선언 - 매개변수 p, q는 int형 포인터 변수(주소)
printf("Before swap: p = %d, q = %d\n", *p, *q); // 사용 - 포인터 변수 p, q의 값(주소X)
int temp = *p;
*p = *q;
*q = temp;
printf("After swap: p = %d, q = %d\n", p, q);
}
int main() {
int i = 10;
int j = 20;
printf("Before swap: i = %d, j = %d\n", i, j);
printf("\n");
swap(&i, &j); // 인수의 형식(포인터 변수 = 주소)에 맞게 전달
printf("\n");
printf("After swap: i = %d, j = %d", i, j);
return 0;
}
Before swap: i = 10, j = 20
Before swap: p = 10, q = 20
After swap: p = 20, q = 10
After swap: i = 20, j = 10
// 함수에 값의 주소가 인수로 전달되었으므로, 함수 밖 변수의 원본이 바뀜
- 포인터 반환
int *func(...) { // 함수의 반환형을 포인터로 선언
int *var;
...
return var;
}'Coding > C' 카테고리의 다른 글
| 12. 문자열 (0) | 2025.11.29 |
|---|---|
| 11. 포인터와 배열 (0) | 2025.11.21 |
| 09. 변수의 범위와 지속기간 (0) | 2025.11.21 |
| 08. 함수 (0) | 2025.10.17 |
| 07. 배열 (0) | 2025.10.16 |