지난 포스팅에 이어 포인터끼리의 연산에 대해서 알아본다.
포인터의 연산에서 헷갈리기 쉽고 중요한 3가지이다.
1. 포인터와 포인터를 더하는 것은 불가능하다.
- 포인터라는 것이 주소 값을 저장하고 있는 변수이고 이 두 개를 더한다는 것은 제3의 주소 값을 만들어 내는 것을 의미한다. 의미가 없는 행위이기에 c언어 자체적으로 지원하지 않는다.
2. 포인터와 포인터를 빼는 것은 가능하다.
- 포인터와 포인터를 빼는 것은 의미가 있다. 왜냐하면 포인터와 포인터를 빼는 행위는 두 주소 사이에 몇 개의 메모리 공간이 있는지 알아낼 수 있기 때문이다. 밑의 예제를 통해서 확인해 볼 수 있다.
3. 포인터와 정수 간의 연산은 가능하다.
- 포인터는 10진수와의 연산이 가능하며 연산할 때마다 포인터 타입 크기만큼 이 16진수로 더해지게 된다.
밑의 예제는 배열에 담겨있는 원소들의 평균값을 구하는 예제이다. 다음을 중점으로 두고 예제를 보면 된다.
1) 우선, arr은 배열의 첫 번째 원소의 주소 값을 의미하기로 c언어에서 약속되어 있다.
2) 그러므로, parr - arr은 포인터와 포인터를 빼는 행위와 마찬가지이다.
3) 그런데 포인터끼리의 뺄 샘은 두 주소 사이의 공간을 나타내므로 parr++를 할 때마다 1씩 차이가 나게 된다.
4) *parr을 통해 주소 값의 실제 데이터에 접근하여 sum에 더해준다.
5) 결과적으로 배열의 모든 원소들을 sum변수에 더할 수 있게 된다.
#include <stdio.h>
int main() {
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int* parr = arr;
int sum = 0;
while (parr - arr <= 9) {
printf("%p \n", parr - arr);
// 포인터와 포인터를 빼는 행위는 두 주소사이에 몇개가 있는지를 계산하는 것이기에 1이 나옴
sum += (*parr);
parr++;
}
printf("평균 : %d \n", sum/10);
return 0;
}
'알고리즘' 카테고리의 다른 글
우선순위 큐 올바른 dequeue (0) | 2020.09.10 |
---|---|
c언어 포인터 (C pointer) (0) | 2020.01.07 |
프로그래머스 탑 자바스크립트로 풀기 (0) | 2019.12.24 |
[DFS] 프로그래머스 네트워크 Javascript 풀이 (0) | 2019.11.04 |
코드그라운드 개구리 뛰기 (0) | 2019.10.24 |