【C/C++】약한 포인터에 대해 신졸 엔지니어가 해설해 보았다

8780 단어 C++C초보자

소개



나의 서투른 포인터에 대해서, 기본적인 사용법, 값 전달, 포인터 전달에 대해 해설한다.

대상자


  • 미경험 신졸 엔지니어
  • C/C++ 입문자
  • 포인터가 잘못 이해되지 않는 분

  • 포인터란?



    · 포인터는 주소를 저장하는 변수입니다.
    · 예를 들어, 유형을 pa로 만들 때 pa *의 유형은 pa에 대한 "포인터"입니다.
    라고 말해도 핀과 오지 않는 사람이 대부분이라고 생각한다. 아래의 코드를보고 싶습니다.
    int a = 100;
    int* pa = &a; // paはaのアドレスを保持:&はアドレス演算子
    cout << *pa << endl; // 出力結果:100(変数にアスタリスクをつけることによってアドレスの中身を参照できるようになる)
    cout << &a << endl; // 出力結果:0x61ff08 (アドレスが出力される)※実行環境によって出力結果は異なる
    

    ・1행째:a의 상자(변수)에 100을 대입
    ・2행째:100이 대입되고 있는 a의 "어드레스"를 pa에 대입하고 있다.
    ※주소를 취득하려면 , 주소 연산자인&를 사용한다

    그림으로 나타내면 다음과 같이 사용된다.

    이미지 할 수 있었을까.

    즉, 주소를 전달하여 값을 전달할 수 있습니다.
    다음은 통상의 값의 전달 방법과 포인터를 이용한 값의 전달 방법 해설한다.

    값 전달과 포인터 전달



    값 전달



    값 전달을 한마디로 말하면 값이 복사되어 인수에 전달됩니다.
    실제로 코드로 확인한다.
    #include <bits/stdc++.h>
    using namespace std;
    
    int add(int a, int b) {
        a = a + b;
        return(a);
    }
    
    int main(void) {
        int x = 100;
        int y = 200;
    
        int total = add(x, y); // 引数として100と200をint a、int bにコピーする
        cout << total << endl; // 出力結果:300
    }
    

    이것은 add의 인수에 x와 y를 지정해 받는 인수에 카피시키고 있다.
    이번 예에서는 사이즈가 작기 때문에 문제는 없지만, 사이즈가 큰 형태가 인수인 경우, 프로그램 실행 결과에 큰 차이가 나타난다.
    또, int형은 4바이트이므로, 이번은 8바이트, 카피분도 포함하면 16바이트를 사용해 버리게 된다.
    다음은 이것을 포인터로 실시하면 어떻게 되는지를 확인해 간다.

    포인터 전달



    값 전달의 처리는 포인터 전달로 설명됩니다.
    #include <bits/stdc++.h>
    using namespace std;
    
    void add(int* a, int* b) {
        *a = *a + *b;
        cout << *a << endl; // 出力結果:300
    }
    
    int main(void) {
        int x = 100;
        int y = 200;
        add(&x, &y); // 引数として「x」の"アドレス"と「y」の"アドレス"を設定する
    }
    
  • main 함수의 add 인수로서 x와 y의 "주소"를 설정한다.
  • 호출 된 add 함수는 인수로 주소를 받아 그 내용을 참조합니다.
  • 값 전달에서는 16 바이트를 사용하고 있었지만, 이번 포인터 전달에서는 8 바이트로 들어가 있다.

  • 값 전달에서는 x와 y의 값을 "복사"하고 있었지만, 포인터 전달에서는 "주소"를 참조함으로써 메모리의 절약, 처리 속도의 고속화로 이어지고 있다.

    확인



    마지막으로 확인을 해보자.
    x와 y의 출력 결과를 생각해 주었으면 한다.
    #include <bits/stdc++.h>
    using namespace std;
    
    void add(int* a , int* b) {
        *a = *a + *b;
    }
    
    int main(void) {
        int x = 100;
        int y = 200;
    
        add(&x, &y);
        cout << x << endl; // 出力結果x:
        cout << y << endl; // 出力結果y:
    
    }
    

    대답: x는 300, y는 200

    y가 200이라는 것은 누구나 알 수 있을 것이다.
    그렇다면 왜 x가 300이 되는가?

    이것은 add 함수의 인수로서 "어드레스"로 전달하고 있기 때문이다.
    100과 200을 가리키는 주소를 건네주고 x의 주소에 x의 주소의 내용(100) + y의 주소의 내용(200)을 *a에 가산해 대입하고 있다.
    add 함수 내의 a는 x의 "주소"를 유지하고 있기 때문에 a의 값을 다시 쓰면 x의 값도 다시 쓰여진다.

    요약



    이번에는 포인터에 대해 간단히 해설해 보았습니다.
    최초의 Qiita 투고였지만, 알기 쉽게 전한다는 것은 정말 어렵습니다.
    그러나 그와 동시에 즐거움도있었습니다. 자신의 출력이되기 때문에 앞으로도 조금씩 기사를 게시하고 싶습니다.

    마지막으로



    나 자신, 아직 이해가 따라잡지 않은 부분 때문에, 잘못된 기재가 있으면, 일보 받을 수 있으면 다행입니다.

    참고문헌/참고 사이트



    비야네 스트라우 스트랩 [시바타 망양 번역] 프로그래밍 언어 C++ [제4판]
    C++ 값 전달, 포인터 전달, 참조 전달 사용
    htps : // 이 m/아가테-p s/있어 ms/05948b7d33f3에88b8967
    손을 움직여 굉장히 이해하는 C언어/C++ 포인터 입문
    h tp : ///ゔぃゔぃ. dyn dns. rg/테 ch/cp/포인테 r. HTML

    좋은 웹페이지 즐겨찾기