프로그래밍 언어/C

C언어 30강) 포인터 연산 사용하기

happy_life 2020. 11. 17. 16:43

참고)

% p : 포인터의 주소를 출력

 

포인터 변수는 읽기 전용의 메모리 주소를 저장한다. 그런데 그러한 메모리 주소를 조작할 수 있는데 그것이 바로 포인터 연산이다.

 

●포인터 연산 코드 예제

#include <stdio.h>

int main()
{
    int num[3] = { 1, 2, 3 };  //int 4byte 

    int *numPtr1;
    int *numPtr2;
    int *numPtr3;

    numPtr1 = num;    // 배열 첫 번째 요소의 메모리 주소를 포인터에 저장

    numPtr2 = numPtr1 + 1;    // 포인터 연산
    numPtr3 = numPtr1 + 2;    // 포인터 연산
    
    printf("numPtr1에 있는 주소값: %p\n", numPtr1);    // 000000000062FDF0: 메모리 주소. 컴퓨터마다, 실행할 때마다 달라짐
    printf("numPtr2에 있는 주소값: %p\n", numPtr2);    // 000000000062FDF4: sizeof(int) * 1이므로 numPtr1주소에서 4증가             
    printf("numPtr3에 있는 주소값: %p\n", numPtr3);    // 000000000062FDF8: sizeof(int) * 2이므로 numPtr1주소에서 8증가

    return 0;
}

결괏값

 

●논리적 그림

▲위의 논리적 그림이 맞다면 *numPt2로 000000000062 FDF4 주소를 역참 조하면 2가 나와야 한다.

 

●numPtr2 역참조 코드 예제

#include <stdio.h>

int main()
{
    int num[3] = { 1, 2, 3 };  //int 4byte 

    int *numPtr1;
    int *numPtr2;
    int *numPtr3;

    numPtr1 = num;    // 배열 첫 번째 요소의 메모리 주소를 포인터에 저장

    numPtr2 = numPtr1 + 1;    // 포인터 연산
    numPtr3 = numPtr1 + 2;    // 포인터 연산
    
    
    printf("numPtr2의 주소값: %p\n", numPtr2);    // 000000000062FDF4: sizeof(int) * 1이므로 numPtr1주소에서 4증가             
    printf("numPtr2의 역참조값: %d\n", *numPtr2); // 2: 000000000062FDF4엔 2값이 들어가므 

    return 0;
}

결괏값

추가 내용)
void 포인터는 자료형의 크기가 정해지지 않았기 때문에 + - 로 얼마나 이동해야 할지 모른다. 따라서 포인터 연산을 할 수 없다. void 포인터로 하고 싶다면, 다른 자료형의 포인터로 변환시킨 뒤 연산을 해야 한다.(그런데 굳이..?)