도쿄/개발

[C언어] 포인터 _ 1차원 배열 완벽 정리

youngKoala 2023. 1. 31. 16:41

C언어 2강.  1차원 배열

 

핵심 : 배열의 이름은 그 배열의 시작 주소이다.

그러므로 포인터 p는 배열의 시작주소 arr을 값으로 담을 수 있다.

int arr[7] = {1,2,3,4,5,6,7}; //배열의 이름 arr은 포인터이다.
int *p; //포인터 p 선언
p = arr; //p[0] == arr[0]

printf("p[0] : %d, arr[0] : %d", p[0], arr[0]);
printf("p의 주소 : %ul, arr의 주소 : %ul", p, arr);

결과 : 

p[0] : 1, arr[0] : 1
p의 주소 : 13927135812l, arr의 주소 : 13927135812l

 

간단한 그림으로 표현하자면 다음과 같다.

 

① 배열 선언     arr[7] = {1,2,3,4,5,6,7};

1 2 3 4 5 6 7

    arr[0]         arr[1]         arr[2]         arr[3]         arr[4]         arr[5]         arr[6]

  *(arr+0)    *(arr+1)     *(arr+2)     *(arr+3)    *(arr+4)     *(arr+5)    *(arr+6)

for(int i = 0; i < 7; ++i){
	printf("%d, %d", arr[i], *(arr+i));
}

 결과 : 

1, 1
2, 2
3, 3
4, 4
5, 5
6, 6
7, 7

JAVA나 Javascript로 배열을 배워서 arr[0]은 익숙해도  *(arr+0)이 이해하기 어렵다면 다음과 같이 풀어서 생각해보면 좋다.

*(arr+0)  :  arr+0이 가리키는(*) 값

 

 

② 포인터 p선언     int  *p;

 

       p

p라는 포인터 변수의 공간이 만들어졌다. 

 

 

③ 포인터 p에 배열 arr의 첫 번째 값을 가리키는 주소 대입      p = arr;   또는   p = arr+0;  

&arr

       p           

 

포인터는 주소를 저장하는 변수이고, 포인터 p에 arr변수의 첫 번째 값을 저장했다면 다음과 같은 일이 벌어진다.

1 2 3 4 5 6 7

     arr[0]         arr[1]        arr[2]          arr[3]        arr[4]         arr[5]         arr[6]

      p[0]           p[1]           p[2]            p[3]           p[4]           p[5]           p[6]

  *(arr+0)    *(arr+1)     *(arr+2)    *(arr+3)     *(arr+4)    *(arr+5)     *(arr+6) 

   *(p+0)      *(p+1)        *(p+2)      *(p+3)        *(p+4)      *(p+5)       *(p+6) 

 

즉,

arr[0]  ==  p[0]  ==  *(arr) ==  *(arr+0) ==  *(p+0)  ==  1

arr[1]  ==  p[1]  ==  *(arr+1) == *(p+1)  ==  2

arr[2]  ==  p[2]  ==  *(arr+2) == *(p+2)  ==  3

 

반응형