본문 바로가기

알고리즘

c언어 포인터(연산)

지난 포스팅에 이어 포인터끼리의 연산에 대해서 알아본다.

포인터의 연산에서 헷갈리기 쉽고 중요한 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;
}