Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

냥집사의 개발일지

C언어 - 배열 & 포인터 (array & pointer) 본문

C언어

C언어 - 배열 & 포인터 (array & pointer)

깅햄찌 2022. 9. 11. 15:03
반응형

안녕하세요 오늘은 배열과 포인터의 관계에 대해 알아보겠습니다. 

아래 목차 순서대로 정리해볼게요~

1. 배열명으로 배열 요소를 사용하는 방법

2. 포인터를 배열명 처럼 사용하는 방법

 

 

1. 배열명으로 배열 요소를 사용하는 방법

먼저 알아야할 것은 배열명은 배열의 첫 번째 요소의 주소입니다.

#include <stdio.h>

int main(){
   int arr[3] = {1,2,3};
   printf("arr[0]'s address : %u\n", &arr[0]);
   printf("arr's address    : %u\n",arr);
    return 0;
}

&arr[0] (arr배열의 첫 번째 요소의 주소 값)이 arr와 같은 것을 확인할 수 있었습니다. 

이 말은 배열명이 첫 번째 요소의 주소 값과 같다는 것임을 알 수 있습니다. 

자, 배열명이 배열의 첫 번째 요소의 주소임을 알았으므로 배열명으로 배열 요소를 접근해보겠습니다. 

아래 코드는 배열명에 정수 연산을 통해 배열 요소를 사용해보는 예제입니다. 

배열명을 통해 arr의 각 요소들에 새로운 값을 할당했습니다. 

 

#include <stdio.h>

int main(){
   int arr[3] = {1,2,3};

   *(arr + 0) = 4;
   *(arr + 1) = 5;
   *(arr + 2) = *(arr + 0) + *(arr + 1);
   printf("arr + 0 = %u\n", arr + 0 );
   printf("arr + 1 = %u\n", arr + 1 );
   printf("arr + 2 = %u\n\n", arr + 2 );

   printf("arr[0]'s address : %u\n", &arr[0]);
   printf("arr[1]'s address : %u\n", &arr[1]);
   printf("arr[2]'s address : %u\n\n", &arr[2]);

   printf("arr[0]'s value : %d\n", arr[0]);
   printf("arr[1]'s value : %d\n", arr[1]);
   printf("arr[2]'s value : %d\n", arr[2]);
    return 0;
}

*(배열명 + 정수) = *(각 배열의 주소) = 배열명[인덱스]

(중요!!) 이때 배열명 즉 주소 값과 정수의 연산은 일반 정수와 정수 연산과 다릅니다. 

아래 결과값에서 알 수 있듯이 arr+0 = 52, arr+1 = 56 arr+2 = 60입니다. 

주소값과 연산되는 정수는 일반 정수라기보다 배열의 인덱스라고 생각하시면 됩니다. 

 

 

 

2. 포인터를 배열명 처럼 사용하는 방법

 

parr 포인터가 arr 즉, arr 배열의 첫 번째 요소의 주소를 가리키게 하면

포인터를 통해서도 배열의 요소에 접근할 수 있겠죠?

#include <stdio.h>

int main(){
   int arr[3] = {1,2,3};
   int *parr = arr;

   *parr = 4;
   *(parr + 1) = 5;
   parr[2] = parr[0] + parr[1];

   printf("arr[0]'s value : %d\n", arr[0]);
   printf("arr[1]'s value : %d\n", arr[1]);
   printf("arr[2]'s value : %d\n\n", arr[2]);

   printf("*(arr + 0) = %d\n", *(arr + 0));
   printf("*(arr + 1) = %d\n", *(arr + 1));
   printf("*(arr + 2) = %d\n\n", *(arr + 2));

   printf("*(parr + 0) = %d\n", *(parr + 0));
   printf("*(parr + 1) = %d\n", *(parr + 1));
   printf("*(parr + 2) = %d\n\n", *(parr + 2));

   printf("parr[0]'s value : %u\n", parr[0]);
   printf("parr[1]'s value : %u\n", parr[1]);
   printf("parr[2]'s value : %u\n\n", parr[2]);


    return 0;
}

arr[0] = *(arr + 0) = *(parr + 0) = parr[0]

arr[0] : arr배열의 첫 번째 요소 값

*(arr + 0) : arr(배열의 주소 값) + 0 이 가리키는 값 -> arr배열의 첫 번째 요소 값

*(parr + 0) : parr은 arr와 같은 값 -> *(parr + 0)는arr의 첫 번째 요소 값

parr[0] : parr를 배열명(arr)처럼 사용 -> arr배열의 첫 번째 요소 값

 

오늘은 배열과 포인터의 관계에 대해 정리해봤습니다. 

 

1. 배열명으로 배열 요소를 사용하는 방법

2. 포인터를 배열명 처럼 사용하는 방법

 

다음 포스팅으로는 변수의 종류 및 데이터 공유에 대해 알아보겠습니다.

감사합니다. 

좋은 하루 보내세요~

Comments