데이터형 *포인터명;
int *p; // int형 변수를 가리키는 포인터
char *pc; // char형 변수를 가리키는 포인터
double *pd; // double형 변수를 가리키는 포인터
&변수명 → 변수의 주소 반환포인터명 → 포인터가 가리키는 변수int a = 10;
int *p = &a; // a의 주소로 초기화
int *q = NULL; // 널 포인터로 초기화 (아무것도 가리키지 않음)
int x = 5;
int *p = &x;
*p = 20; // p가 가리키는 변수(x)에 20 대입
printf("%d", x); // 출력: 20
if(p != NULL) *p = 10;const int *pint * const pconst int * const pp + N: p가 가리키는 데이터형 N개 크기만큼 증가된 주소(p + i)는 배열에서 arr[i]와 동일한 의미p++: 다음 데이터형 크기만큼 주소 증가p--: 이전 데이터형 크기만큼 주소 감소arr[i]와 (arr + i)는 동일한 표현p[i]와 (p + i)는 동일한 표현sizeof(배열명): 전체 배열 크기sizeof(포인터명): 포인터 변수 크기| 구분 | 값에 의한 호출 | 참조에 의한 호출 |
|---|---|---|
| 전달 방법 | 값을 복사해서 전달 | 주소를 전달 |
| 원본 변경 | 불가능 | 가능 |
| 매개변수 | 일반 변수 | 포인터 변수 |
const 포인터로 선언 권장다음 코드의 실행 결과를 예측하시오.
int main() {
int a = 10, b = 20;
int *p1 = &a, *p2 = &b;
printf("a=%d, b=%d\n", a, b);
*p1 = *p2;
printf("a=%d, b=%d\n", a, b);
p1 = p2;
*p1 = 30;
printf("a=%d, b=%d\n", a, b);
return 0;
}
풀이:
a=10, b=20
a=20, b=20 // *p1 = *p2; → a = b의 값
a=20, b=30 // p1 = p2; *p1 = 30; → p1이 b를 가리키므로 b = 30
다음 코드에서 출력되는 값들을 구하시오. (int는 4바이트)
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;
printf("%d\n", *p); // (1)
printf("%d\n", *(p+2)); // (2)
printf("%d\n", *p+2); // (3)
printf("%d\n", *(++p)); // (4)
printf("%d\n", *p++); // (5)
풀이:
(1) 10 // *p = arr[0]
(2) 30 // *(p+2) = arr[2]
(3) 12 // *p + 2 = 10 + 2
(4) 20 // ++p 후 *p = arr[1]
(5) 20 // *p 출력 후 p++, 현재 p는 arr[1]을 가리킴
다음 함수를 완성하여 두 정수의 값을 교환하는 swap 함수를 작성하시오.
void swap(_______ x, _______ y) {
// 함수 구현
}
int main() {
int a = 5, b = 10;
printf("Before: a=%d, b=%d\n", a, b);
swap(_____, _____);
printf("After: a=%d, b=%d\n", a, b);
return 0;
}
풀이:
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
int main() {
int a = 5, b = 10;
printf("Before: a=%d, b=%d\n", a, b);
swap(&a, &b);
printf("After: a=%d, b=%d\n", a, b);
return 0;
}
다음 중 올바른 것은? (복수 선택 가능)
int arr[10];
int *p = arr;
arr[5]와 (arr+5)는 같다p[3]과 (p+3)은 같다arr++는 가능하다p++는 가능하다sizeof(arr)과 sizeof(p)는 같다풀이:
다음 선언들의 의미를 설명하고, 각각에 대해 가능한/불가능한 연산을 표시하시오.
int a = 10, b = 20;
const int *p1 = &a; // (1)
int * const p2 = &a; // (2)
const int * const p3 = &a; // (3)
풀이:
(1) const int *p1: 읽기 전용 포인터
- *p1 = 30; // 불가능 **(값 변경 불가)**
- p1 = &b; // 가능 (포인터 변경 가능)
(2) int * const p2: 상수 포인터
- *p2 = 30; // 가능 (값 변경 가능)
- p2 = &b; // 불가능 (포인터 변경 불가)
(3) const int * const p3: 읽기 전용 상수 포인터
- *p3 = 30; // 불가능 (값 변경 불가)
- p3 = &b; // 불가능 (포인터 변경 불가)
배열의 모든 원소를 출력하는 함수를 작성하시오.
void print_array(__________, int size) {
// 함수 구현
}
int main() {
int numbers[] = {1, 2, 3, 4, 5};
print_array(numbers, 5);
return 0;
}
풀이:
// 방법 1
void print_array(int arr[], int size) {
for(int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
// 방법 2 (동일한 의미)
void print_array(int *arr, int size) {
for(int i = 0; i < size; i++) {
printf("%d ", *(arr + i));
}
printf("\n");
}