47. 포인터 + 정수

C 언어에서 배열 이름은 관리하는 메모리의 시작 주소를 의미하죠.
프로그램에서 배열 이름은 포인터 상수로 취급해요.
따라서 배열을 효과적으로 사용하려면 포인터 관련 연산자를 잘 사용할 수 있어야 겠죠.

C 언어에서 + 연산에는 하나의 포인터 형식과 정수 형식을 피연산자가 오는 것을 허용해요.
이 때 연산 결과는 상대적 거리의 메모리 주소를 의미한답니다.

여기에서 말하는 상대적 거리는 예를 들어 알아볼게요.
int 형식 원소의 포인터 변수의 값이 1000일 때 상대적 거리 4는 1000번지에서 int 형식 원소 4개 크기를 더한 주소예요.
즉 int 형식의 메모리 크기가 4바이트이므로 1000번지에서 상대적 거리 4는 1016이예요.
물론 여기서 1016은 정수 형식이 아니고 포인터 형식이랍니다.

◈ 포인터 변수와 정수 형식 사이의 + 연산

#include <stdio.h>
int main()
{
   int *p = (int *) 1000;
 
    printf("before : %d\n",p);
    p = p+4;
    printf("after : %d\n",p);
 
    return 0;
}

◈ 실행 결과

before : 1000
after : 1016

배열 이름도 관리하는 메모리 시작 주소를 의미해서 프로그램에서는 원소 형식이 같은 포인터 상수로 취급하죠.
따라서 배열 이름도 정수 형식과 + 연산이 가능하며 상대적 거리에 있는 원소의 메모리 주소가 연산 결과예요.

◈ 배열 이름과 정수 형식 사이의 + 연산

#include <stdio.h>
int main()
{
    int arr[10];
    printf("arr:%d\n",arr);
    printf("arr+4:%d\n",arr+4);
    return 0;
}

◈ 실행 결과

arr : 3013304 (실행 환경에 따라 결과는 다를 수 있음)
arr+4 : 3013320 (앞에 출력한 결과에 16을 더한 값임)

◈ 기본 연습 (정답 바로가기)
1. char 형식을 원소로 하는 포인터 변수 p를 선언하고 1000으로 초기화하세요.
그리고 p에 4를 더한 후에 p가 얼마인지 출력하세요.

2. short 형식을 원소로 하는 포인터 변수 p를 선언하고 1000으로 초기화하세요.
그리고 p에 4를 더한 후에 p가 얼마인지 출력하세요.

3. int 형식을 원소로 하며 원소 개수가 10인 배열 arr을 선언하세요.
int 형식을 원소로 하는 포인터 변수 p를 선언하고 arr+5로 초기화하세요.
arr과 p의 값을 출력하세요.