포인터(pointer)

강형우·2022년 12월 4일
0

C++

목록 보기
6/10
post-thumbnail

포인터란 ?

  • 메모리 주소를 담는 변수를 포인터라 한다.
  • 특정 주소에 가면 데이터가 있다는것을 간접적으로 가리키는것을 포인터라 한다.
  • & 기호를 통해 변수의 주소를 나타낸다.
  • e.g)
int x = 3;
cout<< x << endl; // 변수에 저장되어있는 값 3이 나온다.
cout<< &x << endl; // 변수 x의 주소가 나온다.

dereference(역참조)

  • * 기호로 사용한다.
  • 포인터가 단순히 간접적으로 가리키기만 한다면, dereference(역참조)는 직접적으로 접근한다는 의미.
  • e.g)
int x = 3;
cout<< x << endl; // 변수에 저장되어있는 값 3이 나온다.
cout<< *(&x) << endl; // ≒ cout<< *&x << endl; ≒ cout<< x << endl;변수 x의 주소가 나온다.

포인터 변수 선언

int x = 3;
int *ptr = &x;
int y = 5;
int *pointer = nullptr;
pointer = &nullptrr;

함수에서의 포인터

다음과 같이 함수의 리턴값으로 포인터를 가질 수도 있고, 파라미터로 포인터를 사용할 수도 있다.

int *pointerfunction(int *ptr)
{
	return nullptr;
}

nullptr

  • 가리키고 있는 대상이 아무것도 없음을 말한다.
  • 아무것도 가리키고 있는 대상이 없을경우, nullptr로 초기화를 해주자.
int *a; // 선언만 하면 warning이 뜸.
int *a = nullptr; // 초기화를 해주자.

포인터와 배열

포인터와 배열

int arr = [1,2,3,4,5];
int *ptr = arr;

cout << arr[0] << " " <<arr[1] << endl; // 1 2
cout << array << endl; // 010FFAB8
cout << &(array[0]) << endl; // 010FFAB8
cout << *arr << endl; // 1

cout << ptr << endl; // 010FFAB8
cout << *ptr << endl; // 1

cout << sizeof(arr) << endl; // 20
cout << sizeof(prt) << endl; // 32비트에선 4, 64비트에선 8
  • arr와 &arr[0]은 같다.
    • 배열의 이름 == 배열의 첫번째 원소의 주소
  • arr[0]와 *arr는 같다.
    • *arr == 배열의 첫번째 원소를 간접 참조함.
  • int *ptr = arr;
    • 포인터 변수(ptr)가 arr 배열의 주소를 담게 되었으니 이제 ptr로 arr 배열에 간접참조가 가능해짐.
  • *ptr 와 arr[0]은 같다.
    • *ptr = 100은 arr[0]=100과 같다.
      • 배열의 주소를 복사해 담은 포인터로 배열의 원소 값을 이렇게 바꿀 수도 있지만 char * 형 포인터에 char [] 문자열 배열의 원소를 바꾸려는 시도는 불가능하다.
  • sizeof(arr)는 배열의 총 사이즈인 20이다.
  • sizeof(ptr)는 4(32bit)이다.
  • 포인터가 배열을 가리키고 있다고 하더라도 sizeof(ptr)는 포인터의 크기를 알려줌.
void arrptrfunction(int arr[]);
void arrptrfunction(int *arr);
  • 이 두개는 서로 같다.
//void changeArr(int arr[])
void changeArr(int *arr) // arr의 값을 바꿔주는 함수
{
	*arr = 100;
}
int main()
{
	int arr[5] = {1,2,3,4,5};
    void change(arr); // C언어 에선 함수 밖에서도 값이 바뀌도록 파라미터를 포인터로 넣어준다,
    //c++에선 레퍼런스를 더 많이 사용
    cout << arr[0] << endl; // 100
}

포인터 연산과 배열 인덱싱

int main()
{
	// x86기준
	int a = 7;
    int *ptr = &a;
    cout << (int)(ptr - 1) << endl; // 19921724
    cout << (int)(ptr) << endl; // 19921728
    cout << (int)(ptr + 1) << endl; // 19921732
    cout << (int)(ptr + 2) << endl; // 19921736
    
    int arr[] = {1,2,3,4,5};
    int *arrptr = arr;
    cout << *(arrptr + 0) << " " << (int)(arrptr + 0) << endl; // 1 19921724
    cout << *(arrptr + 1) << " " << (int)(arrptr + 1) << endl; // 2 19921728
    cout << *(arrptr + 2) << " " << (int)(arrptr + 2) << endl; // 3 19921732
    cout << *(arrptr + 3) << " " << (int)(arrptr + 3) << endl; // 4 19921736

}
  • int 일땐 arrptr과 arrptr+1 은 4씩 차이가 난다.
  • double 일땐 arrptr과 arrptr+1 은 8씩 차이가 난다.

0개의 댓글