C++ 입문 5일차 - 포인터, 네임 스페이스

하는·약 7시간 전
0

C++ 입문 챌린지

목록 보기
5/5

팀장님이 틈새 C++ 과외해주셨는데 GPT보다 머리에 잘 들어오는 것이다?

*: 포인터
&: 참조자
::: 범위 지정 연산자
std: 네임 스페이스
.: 멤버 연산자
이렇게 5개의 개념을 중점으로 설명해주셨다.

포인터 (*)

  • 메모리 주소를 저장하는 변수

&: 참조자, 주소 연산자

&두가지 기능이 있다.
문맥상 기능을 나누는 것이 아니라, 컴파일러 자체가 문법적으로 구분하여 각각 다르게 처리함.

1. 참조자 선언

  • 기존 변수를 가리키는 또 다른 이름 (like. 별명)
  • 별도의 메모리 주소를 저장하지 않는다.
int num = 10;    // num이라는 변수를 선언하고 값 10을 저장
int &ref = num;  // ref는 num의 참조자 (=별명)

2. 주소 연산자

int num = 10;
int *ptr = # // 여기서 &는 변수의 주소를 가져오는 역할
  • ptrnum의 주소를 저장하는 포인터가 된다.
  • 이 경우 &는 표현식의 일부로 사용된다. 변수 num의 주소를 얻는 주소 연산자로 해석된다.

예시 코드로 이해하기 - *와 &의 관계

int q=0; // 정수형 변수 `q`르 0으로 초기화
int &a=q; //`q`라는 변수의 참조자인 a를 선언. a가 q를 참조한다. a를 수정하면 q가 바뀌고 q를 수정하면 a도 바뀐다.
int *b= &a; // a의 주소를 포인터 b에 저장. b는 a와 q의 주소를 가리킨다.
int c= *b; // b가 가리키는 값을 역참조하여 c에 저장.

ba의 주소를 가리키고, aq를 참조하기 때문에 cq값을 가지게 된다. 결과적으로 c = 0.

int *z=0;

정수형 포인트znullptr로 초기화. z는 아무것도 가리키지 않음.

다중 포인터

int **d= &b;
  • b의 주소를 저장하는 이중 포인터 d를 선언.
  • db라는 포인터를 가리키는 포인터
int ***e  = &d; // e는 b라는 포인터를 가리키는 3중 포인터

다중 역참조

c= *(*d);  // d를 두 번 역참조하여 b가 가리키는 값을 가리킨다. (c=0)
c= *(*(*e)); // e를 세 번 역참조하여 b가 가리키는 값을 가리킨다. (c=0)

네임 스페이스

  • 이름(변수, 함수, 클래스 등)을 구분하기 위해 사용되는 "공간" 또는 "범위
  • 여러 코드나 라이브러리에서 같은 이름의 함수나 변수를 사용할 수 있는데, 그때 이름 충돌을 피하기 위해 필요하다.
namespace std {
    extern ostream cout;   // cout은 표준 출력 스트림(콘솔 출력)과 연결된 ostream 객체
}

범위 지정 연산자 (::)

  • 특정 네임스페이스나 클래스 내에 정의된 함수 또는 변수를 명시적으로 지정할 때 사용
  • std::cout: ::std네임 스페이스에 속한 cout 객체를 명시

번외 . 연산자

. : 객체의 멤버에 접근할 때 사용하는 연산자.

둘을 구분할 때에

#include <iostream>
#include <string>
namespace aaa{
class anda{
    public:
    void va()
    {
        
    }
    
    static va_s()
    {
        
    }
}
}

namespace std
{
    class anda
    {
        public:
        void va()
        {
            
        }
        
        static va_s()
        {
            
        }
    }
    
    bool getline(std::ifstream *f, std::string & s)
    {
        int ** d= &b;
        int **** e  = &d;
        c= *(*d);
        c= *(*(*e));
        
        f->is_open();
        f[0]->is_open();
        *f.is_open();
    }
}

int main() {
    std::ifstream inFile(_T("example.txt"));
    anda::va_s()
    anda a;
    bbb::test()
    
    a.va()
    if (inFile.is_open()) {
        std::string line;
        while (std::getline(&inFile, line)) {
            std::cout << line << std::endl;
        }
        inFile(1);
    }
}
profile
천천히 꾸준히 취미처럼 냐미😋

0개의 댓글