프로그래밍/C언어

[C언어] 포인터(6) -[] 연산자

자바초보 2017. 4. 28. 01:58

안녕하세요 ! 초보개발자 입니다. 

이 블로그는 개인 공부 정리용 블로그 입니다. 

혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.

그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.

그럼 시작하도록 하겠습니다.




[] 연산자


오늘은 [] 연산자에 대해서 알아보겠습니다. []은 어디서 봤을까요 ? 


그렇습니다. 배열에서 요소에 접근할 때 [] 연산자를 이용하여 접근을 하였습니다. []연산자는 지정된 주소에서 i만큼 떨어진 곳의 값을 읽어 오는데 사용 할 수 있습니다. 즉 [] 연산자는 다음과 같이 정의 할 수 있습니다.


주소[i] = 주소에서 i만큼 떨어진 곳에 저장된 값을 반환한다.


이 말을 잘 기억해 주세요. 그렇다면 배열이름[i] 라고 이때까지 알고있었는데 배열이름이 주소라는 이야기 일까요 ? 네 맞습니다. 배열의 이름은 주소 입니다. 배열의 이름은 주소라는 것도 기억해 주세요. 이 내용을 바탕으로 우리는 다음의 식이 성립 한다는 것을 알 수 있습니다. 


arr[i] == *(arr+i)


예제를 통해 위에서 배운 내용을 알아 보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
int main(void) {
 
    int arr[4= { 1,2,3,4 };
    int* ptr = &arr;
 
    printf("arr = %p \t ptr = %p\n", arr, ptr);
    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
        printf("*(arr+%d) = %d \t *(ptr+%d) = %d\n",i, *(arr+i),i, *(ptr+i));
    }
    
    
    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
        printf("arr[%d] = %d \t ptr[%d] = %d\n", i, arr[i], i, ptr[i]);
    }
    
 
    return 0;
}
 
cs


출력 값은 다음과 같습니다.


arr = 0058FC08   ptr = 0058FC08

*(arr+0) = 1     *(ptr+0) = 1

*(arr+1) = 2     *(ptr+1) = 2

*(arr+2) = 3     *(ptr+2) = 3

*(arr+3) = 4     *(ptr+3) = 4

arr[0] = 1       ptr[0] = 1

arr[1] = 2       ptr[1] = 2

arr[2] = 3       ptr[2] = 3

arr[3] = 4       ptr[3] = 4 


실행결과를 통해 위의 식이 성립한다는 것을 알 수 있을 것입니다. 그렇다면 arr 과 ptr 변수는 같은 것 일까요 ? 정답은 아닙니다. 단지 5번째 줄에서 int* ptr = &arr 으로 초기화를 하였기 떄문에 arr과 ptr 은 같은 주소값을 가르킵니다. 그래서 같은 값을 출력하는 것입니다. 만약 &arr대신 다른 값으로 초기화 하였다면 다른 결과를 얻었을 것입니다. 그렇기 때문에 항상 답이 같다고 생각 하면 안됩니다. 


그렇다면 포인터와 배열의 이름의 차이는 무엇일까요 ? 


예를 들어 int arr[1] ={100}; int* ptr=&arr[0]; 이라고 선언을 하고 arr의 주소는 0x100, ptr의 주소는 0x10c라고 가정 해보겠습니다. 그렇다면 다음과 같이 표현할 수 있습니다.



arr 과 ptr 의 값은 0x100으로 같지만 arr은 메모리 주소 그자체이고 ptr의 값은 메모리에 저장된 값이라는 차이가 있습니다. 메모리에 저장된 값은 바뀔 수 가 있지만 주소는 변경 할 수 없습니다. 즉 포인터는 주소를 저장하는 변수 이고 배열의 이름은 주소 그자체라고 할 수 있습니다.


오늘의 강의는 여기서 마치도록 하겠습니다. 다음시간에도 계속해서 포인터에 대해서 알아보도록 하겠습니다. 


수고하셨습니다.