[C 언어] - Pointer Arithmetic

RuiN·2022년 8월 4일
0

C

목록 보기
4/6
post-thumbnail

Pointer Arithmetic

결론만 말하자면

int a[10] 이라는 배열이 선언되었다면!

*a 와 a[0]은 동일한 의미
*a[i]*(a+1)과 동일 , a[i]*(a+i)와 동일하다.

풀어서 설명하겠습니다.

  • int a[10] 이라는 배열이 선언되면 a는 배열의 이름을 가진 포인터변수입니다.
    (주소값을 가지는 값 a)

  • 그렇다면 *a 는 a가 가진 주소값을 가진 곳의 값을 가지겠죠?
    (즉, 배열의 처음값의 주소를 저장한 값이 a)

    여기서 중요한 것은!
    *(a + 1) 은 단순히 a의 값에서 1이 증가한 값이 아닙니다.
    자료형의 바이트 값만큼 증가합니다.

    무슨 말이냐 하면~
    int는 4바이트가 되겠죠?
    여기서 1의 증가는 4 바이트 (메모리 값) 의 증가가 됩니다.

    만약 a의 값이 1004 라면 *(1004 + 4) 가 되겠죠?
    그렇다면 1008의 주소에 위치한 값을 가져오게 되는겁니다.

    결과는? a[1]의 값을 가져오게 되는것이죠....

    말을 너무 길게 했네요..ㅎㅎ

    제가 이해하려고 한겁니다.

그렇다면 결론은
a[ i ] = *(a + i )가 맞는 결론이 나오고!
이러한 수식을 우리는 Pointer Arithmetic 이라고 부른답니다!


+@

그렇다면 자료형 마다 바이트가 다르니~

#include <stdio.h>

int main(void) {

    int data[] = {1, 2, 3};
    char data2[] = {'a', 'b', 'c'};
    long long data3[] = {1, 2, 3};


    int *p = &data[0];
    char *q = &data2[0];
    long long *r = &data3[0];


    printf("%d %x\n", p, p);
    printf("%d %x\n", p + 1, p + 1);
    printf("%d %x\n", p + 2, p + 2);

    printf("%d %x\n", q, q);
    printf("%d %x\n", q + 1, q + 1);
    printf("%d %x\n", q + 2, q + 2);


    printf("%d %x\n", r, r);
    printf("%d %x\n", r + 1, r + 1);
    printf("%d %x\n", r + 2, r + 2);


    return 0;
};

각 포인터 변수 p ,q, r 에 배열의 주소값을 담았다.
long long 의 경우 8 바이트.
printf 의 경우 10진수와 16진수 모두 출력

위와 같은 예제를 만들고! 실행시켜주면~~~

-2044725156 861ff85c
-2044725152 861ff860
-2044725148 861ff864
//p 

-2044725159 861ff859
-2044725158 861ff85a
-2044725157 861ff85b
//q

-2044725184 861ff840
-2044725176 861ff848
-2044725168 861ff850
//r

참고로 주소값이 음수입니다.

int 는 4바이트씩
char 은 1바이트씩
long long 은 8 바이트씩 증가하는 모습을 볼수 있습니다.

profile
어디까지 올라갈지 궁금한 하루

0개의 댓글