본문 바로가기

▶Programming/C

포인터와 배열 관계

int * ptr =arr; <<이 순간 위의 그림과 같음.


1. 첫번째

ptr의 형태가 배열이 되는 것은 대입된 arr이 배열이기 때문이다. 이렇게 이해해야 아래 내용이 쉽다.

(쉬운 이해를 위해 말도 안되는 그림과 설명입니다. 이해바랍니다.)

주소 ptr은 주소 arr과 연결된다. arr은 배열 이름이자 주소(암기). 

다른 표현으로는 &arr과 &arr[0]이 있다. 배열의 첫번째 인자(arr[0])의 주소가 배열의 주소라는 것도 암기!

arr[2]의 주소는? &arr[2] , arr[4]의 주소는? &arr[4]


2. 두번째

*arr과 arr[0]는 같은 뜻이다(암기). *arr은 사실 *(arr+0)이다. 0은 더하나 마나이므로 *arr이 된 것 이다.

*arr과 arr[0]이라면 상상력을 발휘해서 arr[1], arr[2]는 *arr로 어떻게 표현 할지 생각 해보자.


바로 *(arr+1), *(arr+2)로 표현하면 된다. 

ptr이 주소란건 다 안다. 거기에 +1을하면? 바로 다음 주소를 말하는 것(암기).

이를 배열 arr에 적용한것 뿐이다.  정리하자면 arr[i] 는 *(arr+i)와 같다(암기).


자 이제 아래 코드를 보자.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<stdio.h>
//매개변수에 포인터를 표현 할 때 void(int* a,int* b)로 한다. 이는 main에서 포인터 선언과 형태가 같다.
//포인터와 배열은 같은 것이므로 
//매개변수로 배열을 표현 할 땐 main에서 배열을 선언하는 형태인 int arr[5]과 똑같은 형태로 한다.
//다만 일반적으로 매개변수로 배열을 표현 할 땐 int arr[]를 사용한다. int arr[5]로 매개변수를 해도 잘 작동한다.
void left_rotate(int arr[], int length){//배열을 1만큼 왼쪽으로 회전시키는 함수.
 
    //arr[0]은 실제값 *(arr+0)과 같다.call by reference를 참조하면 이 함수가 더 쉽게 이해 될 것이다.
    int last = arr[0];
    int i = 0;
 
    for (i = 1; i < length; i++){
        arr[i - 1= arr[i];
    }
    arr[length - 1= last;
 
}
int main(void){
 
    int arr[5];
    int i = 5;
    for (i = 0; i < 5; i++){
        arr[i] = i+1;//arr[0]엔 1, arr[1]엔 2, ....
    }
    //결과값 1. 여기서 알 수 있는 것: *arr==arr[0]
    printf("%d\n\n"*arr);
    
    int* ptr = arr;
    //*(ptr+2)는 arr로 따지면 ptr[2]에 해당 
    //따라서 우리가 원하는 값은 배열의 세번째 저장 값인 3
    printf("%d\n\n"*(ptr+2));
 
    printf("함수 실행 전 \n");
    printf("%d\n", arr[0]);
    printf("%d\n", arr[1]);
    printf("%d\n", arr[2]);
    printf("%d\n", arr[3]);
    printf("%d\n", arr[4]);
    printf("\n\n");
    //배열의 주소를 인자로 전달. 배열은 &가 붙나 안 붙나 주소이므로
    //아래와 같이 배열의 이름에 &를 해서 넘겨줘도 상관없다. 5는 배열의 크기
    left_rotate(&arr, 5);
    printf("함수 실행 후 \n");
    printf("%d\n", arr[0]);
    printf("%d\n", arr[1]);
    printf("%d\n", arr[2]);
    printf("%d\n", arr[3]);
    printf("%d\n", arr[4]);
 
    return 0;
}
cs

main에서 left_rotate함수를 실행하고 인자로 배열의 이름에 &를 붙여서 줬다. 

코드 위의 글을 다 읽었다면 이해하는데 큰 어려움이 없다.

배열과 포인터는 동일 선상에 있는 개념이기 때문에 모양만 다를뿐 call by reference 다.