[C언어] 포인터와 배열

ET의 공부/C언어|2021. 1. 3. 19:43

배열의 이름은 0번째 배열 원소의 주소다.

#include <stdio.h>
#define Size 10

int main () {
    int Arr[Size] = {0}; //배열 선언,초기화
    printf("배열 이름의 값: %p\n",Arr);
    printf("배열 첫번째 원소의 주소값:%p\n",&Arr[0]);

    return 0;
}
//배열 이름의 값: 0x7ffeefbff5a0
//배열 첫번째 원소의 주소값:0x7ffeefbff5a0

 

위와 같이 배열 Arr의 값(변수명)은 Arr[0]의 주소와 일치합니다. 주소 값은 프로그램이 실행되고 있는 동안 상수로 고정됩니다. 하지만 이들은 포인터 변수에 값으로 대입이 가능합니다. 아래의 코드를 살펴보겠습니다.

 

#include <stdio.h>
#define Size 10

int main () {
    //각 자료형 배열 생성
    char c_Arr[Size] = {0};
    short s_Arr[Size] = {0};
    int i_Arr[Size] = {0};
    
    
    //각 자료형 포인터 생성
    char *c_ptr;
    short *s_ptr;
    int *i_ptr;
    
    
    //배열의 이름(주소)를 포인터 변수에 대입
    c_ptr = c_Arr;
    s_ptr = s_Arr;
    i_ptr = i_Arr;
    

    for(int i = 0; i<Size; i++){
        printf("+%d  char: %p  short: %p  int: %p \n",i, c_ptr+i, s_ptr+i, i_ptr+i);
    }
    return 0;
}
//+0  char: 0x7ffeefbff5be  short: 0x7ffeefbff5a0  int: 0x7ffeefbff570 
//+1  char: 0x7ffeefbff5bf  short: 0x7ffeefbff5a2  int: 0x7ffeefbff574 
//+2  char: 0x7ffeefbff5c0  short: 0x7ffeefbff5a4  int: 0x7ffeefbff578 
//+3  char: 0x7ffeefbff5c1  short: 0x7ffeefbff5a6  int: 0x7ffeefbff57c 
//+4  char: 0x7ffeefbff5c2  short: 0x7ffeefbff5a8  int: 0x7ffeefbff580 
//+5  char: 0x7ffeefbff5c3  short: 0x7ffeefbff5aa  int: 0x7ffeefbff584 
//+6  char: 0x7ffeefbff5c4  short: 0x7ffeefbff5ac  int: 0x7ffeefbff588 
//+7  char: 0x7ffeefbff5c5  short: 0x7ffeefbff5ae  int: 0x7ffeefbff58c 
//+8  char: 0x7ffeefbff5c6  short: 0x7ffeefbff5b0  int: 0x7ffeefbff590 
//+9  char: 0x7ffeefbff5c7  short: 0x7ffeefbff5b2  int: 0x7ffeefbff594 

 

위 코드는

1. char(1바이트) short(2바이트) int(4바이트)의 자료형을 갖는 배열을 선언하고 

2.char(1바이트) short(2바이트) int(4바이트) 포인터를 선언, 각 자료형 배열의 주소 값을 대입합니다.

3. 배열의 크기(10)만큼 포인터 값에 i를 더해 출력을 합니다.

 

결과를 봤을때 처음 주소 값이 1이라면 1,2,3,4,5...처럼 증가해야 하는 것이 맞는 거 같지만 1바이트 자료형인 char를 제외하면 , 2,4바이트씩 주소 값이 증가한 것을 보실 수 있습니다. 포인터 변수에 "더한다"라는 개념은 주소 단위를 더한다 라고 생각하시면 됩니다. 배열에서는 +1은 다음 원소로의 이동을 뜻하기도 합니다.

 

이를 이용하여 배열에 원소에 접근, 그 값을 얻는데 포인터가 사용될수 있습니다.

arr[n] == *(arr+n)   이 성립합니다.

 

#include <stdio.h>
#define Size 10

int main () {
    
    int i_Arr[Size] = {0,1,2,3,4,5,6,7,8,9};
    
    int *i_ptr;
    i_ptr = i_Arr;
    
    for(int i = 0; i<Size; i++){
        printf("i_Arr[%d] : %d \n",i, *(i_ptr+i));
    }
    return 0;
}
//i_Arr[0] : 0 
//i_Arr[1] : 1 
//i_Arr[2] : 2 
//i_Arr[3] : 3 
//i_Arr[4] : 4 
//i_Arr[5] : 5 
//i_Arr[6] : 6 
//i_Arr[7] : 7 
//i_Arr[8] : 8 
//i_Arr[9] : 9 

댓글()