티스토리 뷰

Programming/C언어

[C/C++] 포인터와 배열

Lkt_Programmer 2017. 10. 3. 21:21
반응형

배열의 이름


 
1
2
3
4
5
6
7
8
9
10
int main()
{
    int num[5] = { 1,2,3,4,5 };
 
    printf("%d\n", num);                    //배열의 이름 출력
 
    printf("%d, %d\n", &num[0],&num[1]);    //배열의 첫 번째 요소와 두 번째 요소 주소 출력
 
    return 0;
}

 

 int형 배열 num을 선언하고 첫 번째 줄에서 배열의 이름을 출력하고 두 번째 줄에서 배열의 첫 번째 요소와 두 번째 요소의 주소 값을 출력하고 있습니다. 결과를 살펴 보겠습니다.

 

 

배열의 첫 번째 요소는 13630876 이고 두 번째 요소는 13630880 입니다. 이는 int형 배열이므로 한 개의 배열 요소가 4바이트의 메모리를 차지한다는 것을 의미합니다. 중요한것은 배열의 이름 값과 배열의 첫 번째 요소의 주소값이 같다는 것입니다. 즉 배열 이름은 첫 번째 요소의 주소 값을 나타내는 상수라는 의미입니다.

 

그럼 실제로 포인터 변수에 배열의 이름을 할당하여 각 배열의 각 요소에 접근하는 소스를 보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    int num[5] = { 1,2,3,4,5 };        //int형 배열 num 선언 및 초기화
 
    int *point_num = num;            //int형 포인터에 배열의 시작 주소 할당 
 
    for (int i = 0; i < 5; i++)        //출력
    {
        printf("%d \n", point_num[i]);
    }
 
    return 0;
}

 

- 3번 라인에서 int형 배열 num을 선언하고 할당을 하고 있습니다.

 

- 5번 라인에서 int형 포인터 배열에 num배열의 시작주소를 할당합니다. 하지만 거꾸로 num = ptr은 성립되지 않습니다. num은 상수이기 때문에 새로운 값을 할당 할 수 없습니다.

 

- 9번 라인에서 point_num이 마치 배열 인 것 마냥 각 요소에 접근 하고 있습니다.

 

포인터를 통한 연산


포인터를 통하여 포인터 값을 증가 혹은 감소시키는 연산이 가능합니다. 단 포인터를 가지고 곱셈이나 나누기 같은 연산은 수행되지 않습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
    int *int_point = 0;
    char *char_point = 0;
    double *double_point = 0;
 
    printf("<<int point>>\n");
    printf("%d\n",int_point);
    printf("%d\n", ++int_point);
    printf("%d\n", ++int_point);
 
    printf("<<char point>>\n");
    printf("%d\n", char_point);
    printf("%d\n", ++char_point);
    printf("%d\n", ++char_point);
 
    printf("<<double point>>\n");
    printf("%d\n", double_point);
    printf("%d\n", ++double_point);
    printf("%d\n", ++double_point);
    return 0;
}

 

다음 코드는 int형 포인터 변수, char형 포인터 변수, double형 포인터 변수를 선언하고 각각의 포인터를 증가를 하여 출력을 해주는 코드입니다. 결과부터 보겠습니다.

 

 

포인터 연산에 따른 실질적인 값의 변화는 포인터 타입에 따라 다른 것을 확인 할 수 있습니다. 즉 int형 포인터 변수는 4바이트씩 증가를 하며 char형 포인터는 1바이트, double형 포인터는 8바이트씩 증가하는 것을 확인 할 수 있습니다.

 

마지막으로 포인터 연산을 통하여 배열 요소에 접근하는 소스를 살펴보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    int num[5] = { 1,2,3,4,5 };
    int *point_num = num;
 
    printf("%d \n", *point_num);
    printf("%d \n", *(++point_num));
    printf("%d \n", *(++point_num));
    printf("%d \n", *(point_num+1));
    printf("%d \n", *(++point_num+1));
 
    return 0;
}

 

-6번 라인 : 배열의 시작 주소 ( 배열의 첫 번쨰 요소의 주소)의 *연산자를 통해 값에 접근

-7번 라인 : ++연산 후에 (4바이트 증가한 배열의 주소) *연산자로 값에 접근

-9번 라인 : +1 연산 후에 (4바이트 만큼 증가 후) *연산자로 값에 접근

 

정리하자면 num[i] = *(num + i) = *(point_int+i ) 와 같습니다.

반응형