Language/C언어

어질어질한 포인터 세계

jaewpark 2021. 9. 26. 23:10

어질어질한 포인터 세계, 도서관에서 빌린 포인터 서적이 궁금하기도 하고 좀 더 알아보고 싶어 대여를 했는데, 어질어질하다

과연 이런 코드를 내가 쓸까? 싶긴 하지만, 이해를 하고 넘어가고 싶어 블로그에 적는다

 

배열을 복사해서

1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(){
        int arr[6= { 123456};
        int *cp = arr + 5;
 
        printf("%d, %d, %d, %d, %d, %d", cp[0], cp[-1], cp[-2], cp[-3], cp[-4], cp[-5]);
        return 0;
}
cs

 

이와 같이 쓴다던가 혹은 포인터 배열을 2차원 배열로 사용을 한다면, 

1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(){
        int arr[4= { 1234};
 
        int(*ap)[2= (int(*) [2])arr;
        printf("%d %d %d %d", ap[1][1], ap[1][0], ap[0][1], ap[0][0]);
        return 0;
}
cs

 

arr 배열을 포인터 형태의 2차원 배열로 치환하여 ap 라는 곳으로 넣게 된다.

그러나 여기서 중요한 것은 괄호를 제대로 치지 않으면 에러가 뜨게 된다는 점이다.

기본적으로 포인터를 쓸때에는 *arr+2 이와 같은 형식으로 썼는데, 이러한 방식도 있구나하며 이해만 하고 넘어가야될 것 같다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
struct _point{
        int x;
        int y;
};
 
int main(){
        struct _point sarr[3= {112233};
 
        printf("%d %d\n", sarr->x, sarr->y);
        printf("%d %d\n", (sarr+2)->x, (sarr+2)->y);
 
        printf("%d %d\n", (*(sarr+1)).x, (*(sarr+1)).y);
}
cs

sarr->x == sarr[0].x