본문 바로가기
C/기말고사 대비(2022 1학기)

[C언어 시험대비] 배열포인터

by Meaning_ 2022. 6. 11.
728x90
반응형

배열포인터는 배열의 시작주소값을 저장하는 포인터인데 편하게 배열의 주소가 들어간다고 생각하면 됩니다.

우리가 배열의 주소를 넣을때는 배열의 대표값을 넣는데 그게 첫번째 값이니까 시작주소값을 저장하는거라 생각하면 되는것~!

 

배열포인터는 포인터를 배열처럼 쓸 수 있는데 보통 2차원배열에서 쓴다. 혹은 2차원 배열을 매개변수로 받을 때 쓴다!

 

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
#include<stdio.h>
#include<limits.h>
 
 
 
int main() {
 
    
    char arr[3][7= { "가나다""ABC""포인터" };
 
    char(*data)[7];
 
    data = arr;
 
    for (int i = 0; i < 3; i++) {
        printf("%s\n"*(data + i));
    
 
 
    int arr[2][3= {
        {1,2,3},
        {4,5,6}
    };
 
    int(*ptr)[3];
    ptr = arr;
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", ptr[i][j]);
        }
        printf("\n");
    }
}
 
 
 
 
 
cs

ptr을 arr처럼 쓸 수 있다!

 

 

1차원 배열포인터와 2차원 배열포인터 

자 여기서 궁금증이 생긴다.

 

1차원 배열포인터를 출력할때는 역참조가 필요한데

 

2차원 배열포인터 출력할때는 역참조를 안한다.

아니 배열포인터에 주소값이 들어가면 2차원 배열포인터도 역참조를 해야하는거 아니에요??? 싶다. 이제부터 

이유를 설명하겠다.

 

1차원 배열포인터

 

ptr[1]과 (*ptr)[1]의 차이부터 알아보자.

 

ptr[1]은 *(ptr+1) ==*(&arr+1)인데 &arr+1을 하면 아예 다른 배열을 가리킨다.

실제로도 &arr[0]과 ptr[1]을 같이 출력해보면 두 주소값의 차이가 12바이트인것을 알 수 있다!

arr배열 전체에서 1을 더해준것은 아예 다른 지역으로 넘어간것을 의미한다고 보면 된다!

 

(*ptr)[1]은 (*&arr)[1]인데 *랑 &만나면 소거가 된다! 즉 arr[1]을 가리킨다.

이러한 이유때문에 1차원배열포인터에서 원소에 접근할때는 꼭 *를 써주도록하자. 

 

2차원 배열 포인터

 

2차원 배열 포인터는 애초에 역참조를 두번해주기 때문에 *가 필요없다!

교수님이 설명해주시래도 실제로 2차원 배열들의 포인터를 배열포인터라고 하셨다. 

 

arr[i][j]는 실제로 컴퓨터가 인식할 때 *(*(arr+i)+j) 로 인식하는데 여기서 역참조 두번이라는 말이 나온거다! 더 자세히 알아보자~

 

예를 들어 ptr[2][1]의 값을 알아본다고 해보자.

자 int(*ptr)=arr이다.

그러니까 ptr에는 &arr[0]이 들어있는거다

 

ptr[2][1]을 해부해보면 *(*(ptr+2)+1)이 되는데 

*(ptr+2)부터 보면 *(&arr[0]+2)는 *(arr+2)가 되면서 *(&arr[2]) == arr[2]가 된다.

어라랏 arr[2]도 배열이다. 그러면 얘도 사실상 &arr[2][0]를 가리킨다.

*(&arr[2][0]+1) ==*(&arr[2][1]) 이 되면서 ptr[2][1]은 arr[2][1]이다. 

 

난이도 극악

 

이 칭구를 이해해보자.

 

자 우선 row는 배열포인터다. 우선 arr[0]이 여기에 들어갈건데 arr[0]은 배열이다. 

그니까 row에는 arr[0] 배열의 주소값 &arr[0]이 들어있다.

int* col=*row를 하면 *(&arr[0])이 되면서 col은 arr[0]을 가리키는데 arr[0]은 결국에 배열이기때문에

사실상 arr[0]은 &arr[0][0]과 같다고 봐도 된다.

아 그래서 arr[0][0]+1 하면 arr[0][1]되고 arr[0][0]+2하면 arr[0][2]되면서

궁극적으로 *col은 arr[i][j]에 해당하는 값들을 출력하는 것이다!

 

2차원 배열 매개변수로 전달

1) 배열 포인터를 쓴다.

 

2) float arr[][2] 을 매개변수로 

 

공백을 사용하는 방법도 있다. 

728x90
반응형

댓글