[C언어] 포인터(6) -[] 연산자
안녕하세요 ! 초보개발자 입니다.
이 블로그는 개인 공부 정리용 블로그 입니다.
혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.
그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.
그럼 시작하도록 하겠습니다.
[] 연산자
오늘은 [] 연산자에 대해서 알아보겠습니다. []은 어디서 봤을까요 ?
그렇습니다. 배열에서 요소에 접근할 때 [] 연산자를 이용하여 접근을 하였습니다. []연산자는 지정된 주소에서 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의 값은 메모리에 저장된 값이라는 차이가 있습니다. 메모리에 저장된 값은 바뀔 수 가 있지만 주소는 변경 할 수 없습니다. 즉 포인터는 주소를 저장하는 변수 이고 배열의 이름은 주소 그자체라고 할 수 있습니다.
오늘의 강의는 여기서 마치도록 하겠습니다. 다음시간에도 계속해서 포인터에 대해서 알아보도록 하겠습니다.
수고하셨습니다.