반도체/C++

35. C++에서의 포인터 개념

Clair_de_Lune 2024. 9. 3. 15:09
728x90

C++에서 포인터는 메모리 주소를 저장하는 변수입니다. 포인터를 사용하면 변수의 주소를 직접 조작할 수 있으며, 이를 통해 동적 메모리 할당, 배열과 문자열 처리, 함수 인자 전달 시 효율성을 높일 수 있습니다. 

 

 

1. 포인터의 기본 개념

  • 포인터 선언: 포인터는 특정 데이터 타입의 변수의 주소를 저장합니다. 포인터를 선언할 때는 데이터 타입 뒤에 * 기호를 붙입니다.
    int* ptr; // int형 포인터 ptr 선언
    
  • 주소 연산자 &: 변수의 주소를 얻기 위해 & 연산자를 사용합니다.
    int a = 10;
    int* ptr = &a; // a의 주소를 ptr에 저장
    
  • 역참조 연산자 *: 포인터가 가리키는 주소의 값을 얻기 위해 * 연산자를 사용합니다.
    int value = *ptr; // ptr이 가리키는 주소의 값을 가져옴 (a의 값)
    

2. 포인터의 사용

2.1. 기본적인 포인터 사용 예

#include <iostream>

int main() {
    int a = 10;
    int* ptr = &a; // a의 주소를 ptr에 저장

    std::cout << "a의 값: " << a << std::endl; // 10
    std::cout << "a의 주소: " << &a << std::endl; // a의 메모리 주소
    std::cout << "ptr의 값 (a의 주소): " << ptr << std::endl; // a의 메모리 주소
    std::cout << "ptr을 통해 가져온 a의 값: " << *ptr << std::endl; // 10

    return 0;
}

2.2. 동적 메모리 할당

C++에서는 new 연산자를 사용하여 동적으로 메모리를 할당하고, delete 연산자를 사용하여 메모리를 해제할 수 있습니다.

#include <iostream>

int main() {
    int* ptr = new int; // int형 변수를 위한 메모리 동적 할당
    *ptr = 20; // 메모리 주소에 값 할당

    std::cout << "동적 할당된 값: " << *ptr << std::endl; // 20

    delete ptr; // 메모리 해제
    ptr = nullptr; // 포인터 초기화

    return 0;
}

2.3. 배열과 포인터

배열 이름은 배열의 첫 번째 요소의 주소를 나타내므로, 포인터와 배열은 밀접한 관계가 있습니다.

#include <iostream>

int main() {
    int arr[3] = {1, 2, 3};
    int* ptr = arr; // 배열의 첫 번째 요소의 주소를 ptr에 저장

    for (int i = 0; i < 3; ++i) {
        std::cout << "arr[" << i << "] = " << *(ptr + i) << std::endl; // 포인터를 통해 배열 접근
    }

    return 0;
}

3. 포인터의 중요성

  • 효율적인 메모리 사용: 포인터를 사용하면 메모리를 직접 관리할 수 있어, 대용량 데이터 처리 시 메모리 사용을 최적화할 수 있습니다.
  • 함수 인자 전달: 포인터를 사용하여 함수에 인자를 전달하면, 인자의 복사 없이 원본 데이터를 수정할 수 있습니다.
#include <iostream>

void increment(int* ptr) {
    (*ptr)++; // ptr이 가리키는 값 증가
}

int main() {
    int a = 5;
    increment(&a); // a의 주소를 전달
    std::cout << "증가된 값: " << a << std::endl; // 6

    return 0;
}

4. 포인터의 주의사항

  • 널 포인터: 포인터가 아무것도 가리키지 않도록 초기화할 때는 nullptr를 사용합니다.
  • 메모리 누수: 동적 할당한 메모리는 사용 후 반드시 해제해야 하며, 그렇지 않으면 메모리 누수가 발생합니다.
  • 포인터 연산: 포인터를 사용하여 메모리 주소를 직접 조작할 수 있지만, 잘못된 접근은 프로그램의 비정상 종료를 초래할 수 있습니다.
728x90

'반도체 > C++' 카테고리의 다른 글

38. C++ 화살표 연산자  (0) 2024.09.04
36. C++에서 배열과 포인터 관계  (0) 2024.09.03
34.1 사원 관리 프로그램 추가 C++  (0) 2024.09.03
34. 사원관리 프로그램 C++  (0) 2024.09.03
33. C++의 GET & SET  (1) 2024.09.03