Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Tags more
Archives
Today
Total
관리 메뉴

Hello Security World

C언어 [C언어 배열 포인터] 본문

프로그래밍/C

C언어 [C언어 배열 포인터]

프로앱등이 2020. 5. 3. 19:48

C언어 배열 포인터

포인터 변수를 사용해서 데이터를 처리하기 위해서는 메모리에 저장된 데이터 타입과 동일한 데이터 타입을 갖는

포인터 변수가 필요하며, 이 때 사용하는 포인터를 '배열 포인터' 라고 한다. 다차원 배열은 배열이 배열 요소가 되므로

배열형 포인터가 필요하다. 즉, 배열 포인터 는 배열을 가리키는 포인터를 의미하며 부분 배열을 배열 요소로 갖는

다차원 배열을 처리하는데 사용되는 포인터이다.

쉽게 얘기하면 2차원 이상의 배열을 사용할때 해당 자료형을 저장하기 위한 것 그리고 , 함수의 파라미터 값으로 인자를 넘길때 실 매개변수 에서 배열을 받기 위한 방식이다.

예제) 배열 포인터의 사용 예시

1
2
3
4
5
6
7
\배열 요소의 데이터 타입 (*포인터 변수)[배열의 크기];
 
int arr[2][3];
int (*ptr)[3];
point = arr; // 배열명은 배열의 시작주소를 의미하기 때문에 & 생략
 
 
 

 

예제) 배열 포인터를 사용하여 2차원 배열을 처리하는 프로그램

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main()
{
    int arr[2][4={{10,20,30,40},{40,30,20,10}};
    int (*ptr)[4= arr;
    int row,col; //행 , 열 
    
    for(row=0;row<2;row++
    {
        for(col=0;col<3;col++)
        {
            printf("[%d]",ptr[row][col]);
        }
        printf("\n");
    }
    
}
 
 

아마 int (*ptr)[4] = arr; 이 부분이 햇갈릴것이다 분명 배열은 2차원인데 배열 포인터로 받을때는 1차원으로 받는가? 에 대한 고민을

했을거라고 생각한다.

10 배열 [0][0]

20 배열 [0][1]

30 배열 [0][2]

40 배열 [0][3]

40 배열 [1][0]

30 배열 [1][1]

20 배열 [1][2]

10 배열 [1][3]

위와 같이 배열이 있다고 하자 int (*ptr)[4] 이 의미하는 것은 4byte공간이 4개 있다라고 알려주는 것이다. 1차원으로 생각하면

1차원짜리 배열 2개가 있고 열은 4개가 있는것이다 그래서 컴파일러 에게 1차원 int형 4byte 공간 4개가 있다 라고 하는것이다.

int (*ptr)[4] = arr; 이 의미하는것은 1차원짜리 배열공간이 4개가 있고 '행' 을 알려주는것이다 arr은 행을 가지고 있다고 생각하자.

쉽게 이해하기 위하여 위와 같이 설명을 하였다.

그렇다면 왜 배열 포인터를 사용하는것일까?

그 이유는 다차원의 배열을 저장하는 방법 때문이고 함수로 파라미터 인자값으로 형식 매개변수가 받을때 문제가 발생하기 때문이다.

물론 배열 포인터를 사용하지 않아도 가능하다 내부적으로 컴파일러가 알아서 처리하기 때문에.

하지만 C언어를 배우는 사람이라면 포인터를 사용할 줄 알아야한다.

1. 배열 포인터 사용하여 다차원 배열 함수 인자 전달받기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
//배열 포인터로 함수 인자 받기
char print(char (*pointer)[8]); //출력함수 
int main()
{
    char str[3][8]={"hello","pointer","good"};
    print(str); 
    return 0;
}
char print(char (*pointer)[8]) //출력함수 
{
    int i;
    for(i=0;i<3;i++)
    {
       printf("%s\n",pointer+i);
    }
    return 0;
}
실행결과
hello
pointer
good
 

위와 같은 형태로 배열 포인터를 사용하여 함수의 매개변수로 받을수 있는 방법이 있다.

2. 배열 포인터 사용하지 않고 다차원 배열 함수 인자 전달받기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
//다차원 배열 함수 인자로 전달하는 프로그램 
char print(char pointer[][8]);
int main()
{
    char str[3][8]={"hello","pointer","good"};
    print(str); 
    return 0;
}
char print(char pointer[][8]) //출력함수 
{
    int i;
    for(i=0;i<3;i++)
    {
       printf("%s\n",pointer+i);
    }
    return 0;
}
실행결과
hello
pointer
good
 
 

결과는 동일핟 배열 포인터를 쓰지 않아도 '열'의 갯수만 알려주면 동일한 결 과를 출력 할 수 있다.