본문 바로가기
C │ C++ │ C#/C++

C++ Chapter 6.8 : 포인터의 연산과 배열 인덱싱

by Pokaa 2023. 10. 15.
728x90
728x90
SMALL
포인터 연산

 

  • 포인터를  uniptr_t 로 형변환 하면 주소가 정수로 보기 좋게 나온다.
using namespace std;

int main()
{
    int value = 7;
    int * ptr = &value;

    cout << uniptr_t(ptr - 1) << endl;
    cout << uniptr_t(ptr) << endl;
    cout << uniptr_t(ptr + 1) << endl;
    cout << uniptr_t(ptr + 1) << endl;
}
  • int형 포인터에 1을 더해주면 주소값이 1 증가하는 것이 아닌 4$($bye$)$가 증가한다.
  • double형 포인터에 1을 더해주면 주소값이 1 증가하는 것이 아닌 8$($byte$)$이 증가한다.
    ο double 데이터 타입의 크기는 64bit = 8byte니까 double끼리는 서로 주소가 8칸 차이나기 때문
        ■ 메모리 공간 1칸당 8bit

주소값들은 가르키는 데이터타입의 크기만큼 차이가 난다.

  •  int * ptr 일 때  ptr 과  $($ptr + n$)$ 의 값은 4n 씩 차이난다.
  •  dobule * ptr 일 때  ptr 과  $($ptr + n$)$ 의 값은 8n 씩 차이난다.

 

 

포인터로 배열 인덱싱
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int array[] = { 9,7, 5, 3, 1 };

    cout << array[0] << " " << (uintptr_t)&array[0] << endl;
    cout << array[1] << " " << (uintptr_t)&array[1] << endl;
    cout << array[2] << " " << (uintptr_t)&array[2] << endl;
    cout << array[3] << " " << (uintptr_t)&array[3] << endl;

    return 0;
}
  • 배열의 주소를 담고 있는 포인터는 가르키고 있는 배열을 인덱싱할 수 있는데  [ ] 말고도 포인터 연산을 이용해  *$($ptr + i$)$ 이런식으로 접근할 수 있다.
    ο  array[i] = *$($ptr + i$)$
    ο  &array[i] = ptr + i
728x90
300x250
LIST