[C++] 포인터

chxxrin·2024년 7월 24일
0

C++

목록 보기
9/22

주소

    int a = 123;

    // address of 주소 연산자 & ampersand
    cout << a << " " << &a << endl;
   // 123 0x16d40b228
  • 변수 a의 주소 : &a
    int *b = &a; // b에 a의 주소 대입

    // deference operator (역참조 연산자)
    cout << *b << endl;
    // 123

    *b = 567;

    cout << a << " " << b << " " << *b << endl; // 추측해보세요
    // 567 0x16d40b228 567
  • b의 포인터에 a의 주소를 넣음
  • *b는 주소가 아니라 포인터임! 그래서 이상한 16진수가 아니라 값이다!(정수, 문자열 등등)
  • 즉, a 와 *b 는 같다

  • 포인터 변수 b를 이용해서 a의 값을 바꾼 것!

포인터 자체의 주소 크기와 자료형의 크기

  • 주소 자체의 크기는 항상 동일하다
  • int든 double이든 모두 8로 동일하다
    double *c = nullptr; // 아무 주소도 가리키고 있지 않다는 의미로 초기화, 0도 많이 사용

    cout << sizeof(int) << " " << sizeof(double) << endl;     // 4 8
    cout << sizeof(int *) << " " << sizeof(double *) << endl; // 8 8 
    cout << sizeof(b) << " " << sizeof(c) << endl; // 8 8

포인터 연산과 배열

    cout << sizeof(size_t) << endl; // 8
    cout << size_t(b) << " " << size_t(b + 1) << " " << size_t(b + 2) << endl; // int형 포인터 : 6127923752 6127923756 6127923760 (차이:4byte씩 증가,int형의 포인터이므로)
    cout << size_t(c) << " " << size_t(c + 1) << " " << size_t(c + 2) << endl; // double형 포인터 : 0 8 16 (차이:8byte씩 증가,double형의 포인터이므로)

  • size_t : 여기서는 주소를 10진수로 변환하기 위한 용도로 사용
  • int형 포인터는 4byte씩 증가
  • double형 포인터는 8byte씩 증가

문자열, 배열 연결시키기


    char my_str[] = {'h', 'e', 'l', 'l', 'o'}; // "Hello"

    char *ptr = my_str; // 배열의 이름은 포인터

    cout << *(ptr + 3) << endl; // 추측해보세요.
    cout << *(my_str+3) << endl;
    cout << ptr[3] << endl;
    // 출력 : l
  • 배열은 변수 자체(my_str)가 포인터이므로 &를 붙이지 않아도 된다
  • *ptr : h
  • *(ptr+1) : e
  • *(ptr+2) : l
  • *(ptr+3) : l
1. *(ptr + 3)
2. *(my_str+3)
3. ptr[3]

-> 모두 같음

전체 코드

/*
    홍정모 연구소 https://honglab.co.kr/
*/

#include <iostream>

using namespace std;

int main()
{
    int a = 123;

    // address of 주소 연산자 & ampersand
    cout << a << " " << &a << endl;
    // 123 0x16d40b228

    // 참고: 파이썬 id()와 비교

    int *b = &a; // b에 a의 주소 대입

    // deference operator (역참조 연산자)
    cout << *b << endl;
    // 123

    *b = 567; // a == *b

    cout << a << " " << b << " " << *b << endl; // 추측해보세요
    // 567 0x16d40b228 567

    // 포인터 자체의 주소 크기와 자료형의 크기 (주소의 크기는 항상 동일하다.)
    double *c = nullptr; // 아무 주소도 가리키고 있지 않다는 의미로 초기화, 0도 많이 사용

    cout << sizeof(int) << " " << sizeof(double) << endl;     // 4 8
    cout << sizeof(int *) << " " << sizeof(double *) << endl; // 8 8 
    cout << sizeof(b) << " " << sizeof(c) << endl; // 8 8

    // 포인터 연산과 배열

    // size_t 안내 (여기서는 주소를 10진수로 변환 용도)
    cout << sizeof(size_t) << endl; // 8
    cout << size_t(b) << " " << size_t(b + 1) << " " << size_t(b + 2) << endl; // int형 포인터 : 6127923752 6127923756 6127923760 (차이:4byte씩 증가,int형의 포인터이므로)
    cout << size_t(c) << " " << size_t(c + 1) << " " << size_t(c + 2) << endl; // double형 포인터 : 0 8 16 (차이:8byte씩 증가,double형의 포인터이므로)

    // sizeof(char) == 1입니다. char* e = 0; e + 15 는 몇일까요?
    // 확인도  직접 해보세요

    // 문자열, 배열 연결시키기

    char my_str[] = {'h', 'e', 'l', 'l', 'o'}; // "Hello"

    char *ptr = my_str; // 배열의 이름은 포인터

    cout << *(ptr + 3) << endl; // 추측해보세요.
    cout << *(my_str+3) << endl;
    cout << ptr[3] << endl;
    // l

    return 0;
}

출처 : 홍정모 유튜브

0개의 댓글

관련 채용 정보