Open-Closed Principle

[C언어] 1차원 배열과 포인터 본문

Programming/C, C++

[C언어] 1차원 배열과 포인터

대박플머 2014. 6. 29. 16:04

배열과 포인터를 자유 자제로 사용하는 법에 대해서 알아보도록 하자.

아래 소스를 보면서 이야기를 시작하다로고 하자. 

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
 
int main(){
    
    int imsi[3] = { 5, 3, 7}; //배열
    int* imsip; // 포인터
 
    imsip = imsi; // 포인터 초기화
 
    printf("%d\n",*imsip); // A
 
}


A의 결과에 대해서 생각해보자. 배열과 포인터의 관계에 대해서 조금 알고 있는 분이라면 답이 근방 나왔을 것이다. 

결과는 '5'이다. 

결과를 통해서 알 수 있는 사실에 대해서 생각해 보자. 

1. 배열명은 주소를 뜻한다. 

2. 배열명은 배열의 첫번째 배열 요소의 주소를 뜻한다. 

위의 예제를 통해서 우리는 두가지 사실에 대해서 알 수 있게 되었다. 


다음 예제를 보면 위에서 이야기 했던 2가지가 사실이라는 것을 알 수 있다. 

Colored By Color Scripter

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
 
int main(){
    int imsi[3] = { 5, 3, 7};
    int* imsip;
 
    imsip = imsi;
 
    printf("%#010x\n",imsi);
    printf("%#010x\n",&imsi[0]);
    printf("%#010x\n",imsip);
 
}

위의 예제 소스를 돌려 보면 알겠지만 결과가 모두 일치한다. 

처음 예제를 통해 알 수 있던 사실이 실제로도 그렇다는 것을 볼 수 있는 예제 이다. 

배열과 포인터를 묶어서 이야기 하는 이유는 배열의 접근법 처럼 포인터또한 접근하는 방식이 비슷하기 때문이다. 

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(){
    int imsi[3] = { 5, 3, 7};
    int* imsip;
    int i = 0;
 
    imsip = imsi;
 
    printf("imsip output ----\n");
    for(i = 0; i< 3;i++){
        printf("%d \n", imsip[i]);
    }
 
    printf("imsi output ----\n");
    for(i = 0; i< 3;i++){
            printf("%d \n", imsi[i]);
        }
}
 

 예제 소스를 보면 알겠지만 배열의 인덱스로 접근하는 방법을 포인터에서도 동일하게 적용이 된다는 점이다. 

포인터 연산을 잘 사용하지 못하는 사람들에게는 아주 유용한 방법이다. 차후에 2차원 배열과 포인터에대해서도 포스팅을 하긴 하겠지만 2차원 배열 또한 유사한 방법으로 사용할 수 있다. 


실체로 포인터 연산을 통하여 접근하는 방법이다. 

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(){
    int imsi[3] = { 5, 3, 7};
    int* imsip;
    int i = 0;
 
    imsip = imsi;
 
    printf("imsip output ----\n");
    for(i = 0; i< 3;i++){
        printf("%d \n", *(imsip+i)); // A
    }
 
    printf("imsi output ----\n");
    for(i = 0; i< 3;i++){
            printf("%d \n", imsi[i]);
        }
}
 

// A 부분에서 포인터 연산이 처음에는 잘 이해가 가지 않을 것이다. 그런데 바로 위의 소스와 비교해서 하나하나 뜻어 보면 이해가 갈것이다. 

참고로 포인터에 연산을 하는 벙법이 이해가 가지 않을 수도 있을 것이다. 포인터 연산에서 덧샘과 뺄샘이 일반적으로 사용되는데 자신의 자료형 만큼 덧샘이 이루어진다는 점 참고하길 바란다. 예를 들어, int형을 사용한 포인터에  + 1을 하면 4바이트를 더하라는 말이다. 
덧붙여서 배열을 순차적으로 메모리에 할당 되기 때문에 이렇게 덧샘연산과 뺼샘 연선을 할 수 있다는 것도 알아두어야 할 것이다.