활동 목표
- 포인터, 배열, 스트링
활동 결과
포인터
- 포인터 변수
- 포인터는 메모리 내의 바이트 주소를 저장하는 변수로, 다른 변수의 “주소”를 가리킨다.
- 포인터 변수 선언은 일반 변수 선언과 유사하지만, 변수 이름 앞에 별표(*)를 붙여 해당 포인터가 특정 타입의 개체를 가리킴을 명시한다.
- 예시 코드:
int *p; int i, j, a[10], b[20], *p, *q;
- 예시 코드:
- C는 포인터가 오로지 특정 형(예: int, double, char)의 개체만을 가리키도록 강제한다.
- 주소 및 참조 연산자
- 주소 연산자 (&): 변수의 메모리 주소를 반환한다. 예를 들어, &i는 변수 i의 첫 번째 바이트 주소이다.
- 참조(역참조) 연산자 (*): 포인터가 가리키는 개체의 값을 읽거나 수정할 수 있게 한다.
- 예시 코드:
int i; int *p = &i; printf("%d\n", *p); // i의 값을 출력
- 예시 코드:
- *와 &는 서로 상쇄되므로, j = *&i;는 j = i;와 동일하다.
- 초기화되지 않은 포인터에 대해 *연산자를 사용하는 것은 정의되지 않은 행동(불능행동)을 초래하므로 주의해야 한다.
- 포인터 할당
- 포인터 변수 간의 할당은 주소값을 복사하는 것이다.
- 예시 코드:
int i; int *p, *q; p = &i; // i의 주소를 p에 저장 q = p; // p가 가리키는 주소(즉, i의 주소)를 q에 복사
- 예시 코드:
- 이 경우, *p와 *q는 모두 변수 i에 접근하며, 하나를 수정하면 다른 값도 변경된다.
- q = p; (포인터 할당)와 *q = *p; (값 복사)는 완전히 다른 의미를 가진다.
- 포인터 변수 간의 할당은 주소값을 복사하는 것이다.
- 입력변수로서 포인터
- 포인터를 함수의 인자로 전달하면, 함수는 변수의 원본 주소를 받아 해당 변수의 값을 직접 읽거나 수정할 수 있다.
- 예시:
- 함수 원형:
void decompose(double x, long* out_int_part, double* out_frac_part);
- 호출:
decompose(3.14159, &i, &d);
- 함수 원형:
- 예시:
- 함수 내부에서는 포인터에 역참조(*)를 사용하여 원본 변수에 접근하므로, 값의 수정이 가능하다.
- scanf 함수도 변수의 주소(포인터)를 받아 입력한 값을 해당 변수에 저장한다.
- 잘못된 방식(예: scanf("%d", &p);)으로 포인터를 전달하면 오류가 발생할 수 있다.
- 포인터를 함수의 인자로 전달하면, 함수는 변수의 원본 주소를 받아 해당 변수의 값을 직접 읽거나 수정할 수 있다.
- const로 입력변수 보호하기
- 함수에 전달된 포인터가 가리키는 데이터를 수정하지 않도록 보장하려면, 매개변수 선언 시 const를 사용할 수 있다.
- 예시 코드:
void f(const int* p) { // *p = 0; // 컴파일 오류 발생: p가 가리키는 값을 수정할 수 없음 }
- const를 사용하면 함수 내부에서 의도치 않은 데이터 변경을 방지할 수 있어, 코드의 안정성을 높인다.
- 반환값으로서 포인터
- 함수는 포인터를 반환할 수 있으며, 이를 통해 함수 외부에서 특정 데이터에 대한 참조(주소)를 활용할 수 있다.
- 예시 코드:
int* get_max(int* left, int* right) { return (*left > *right) ? left : right; } // 호출 예시: int i, j; int* p = get_max(&i, &j);
- 반환된 포인터는 외부 변수의 주소나 배열의 원소 주소 등을 가리킬 수 있다.
- 주의: 함수 내부의 자동 지역 변수의 주소를 반환하면, 해당 변수는 함수 종료 후 소멸하므로 반환된 포인터는 유효하지 않다.
- 포인터와 배열 및 프로그램 예제
- 포인터는 배열의 원소 주소를 가리킬 수 있으며, 배열 이름 자체가 포인터 상수처럼 사용되는 경우도 많다.
- 프로그램 예제: 배열의 최대/최소 원소를 찾는 함수
- 함수 원형:
void get_max_min(int arr[], int size, int* out_max, int* out_min);
- 호출 예시:
get_max_min(b, N, &big, &small);
- 함수는 배열 b의 최대값을 *out_max에, 최소값을 *out_min에 저장하여 각각 big과 small 변수에 결과를 전달한다.
- 함수 원형:
- 이와 같이 포인터를 활용하면, 함수가 여러 값을 반환하는 효과를 낼 수 있다.
참고 자료
- King, K. N., 2008, C Programming: A Modern Approach, W. W. Norton & Company.
'모각코 > 2025 동계 모각코' 카테고리의 다른 글
[2025 동계 모각코] 모각코 5차 활동 기록 (0) | 2025.02.13 |
---|---|
[2025 동계 모각코] 모각코 4차 활동 기록 (0) | 2025.02.03 |
[2025 동계 모각코] 모각코 2차 활동 기록 (0) | 2025.01.16 |
[2025 동계 모각코] 모각코 1차 활동 기록 (0) | 2025.01.03 |
[2025 동계 모각코] 모각코 개인 계획 (0) | 2025.01.03 |