ポインタと文字列

7092 ワード

📒 ししん


メモリアドレスを持つ変数
  • 変数のアドレスを知りたいですか?=>&
  • を使用
    int i = 10;
    char c = 69;
    cout << &i;     // 변수 i가 저장된 메모리의 주소가 출력
    cout << (void*)&c;  //
    ##포인터 선언 및 초기화 방법
    1
    int* ptr;
    ptr = &i;
    
    2 
    int* ptr = &i;

    🙌 voidポインタ


    voidポインタは、データ型の特性が不確定であるため、任意のデータ型のポインタを格納することができる.
    逆にvoidポインタは、様々なデータ型のポインタに格納することができる.この特性からvoidポインタを汎用ポインタと呼ぶ.
    ただし、voidポインタはデータ型を特定していないため、取得または格納値のサイズも特定していないため、voidポインタは逆参照できない.
    ptr = numPtr1;        // void 포인터에 int 포인터 저장
    printf("%d", *ptr);   // 컴파일 에러. void 포인터는 역참조할 수 없음

    アドレスは1つの形式しかなく、ポインタには複数のタイプの理由があります。


    メモリ内のアドレスは同じサイズであるため、どの形式でもアドレスのフォーマットに差はありませんが、プログラミングエラーを回避するためには、ポインタが指すタイプが正しいことを確認する必要があります.
    Tip.
    カッコ
  • を使用して逆参照を行い、演算子の優先度による計算の混乱を回避します.
    ex) (*ptr)++

  • ポインタが宣言され、初期化されていない場合、ポインタは任意のアドレスを指します.
    NULLで初期化した方が良い!

  • 配列の名前はポインタ->配列の名前に他の変数のアドレスを挿入できますか?
    No,配列の名前はポインタ定数です.値は変更不可
  • 🙌 実際にポインタを使用する場合

  • 動的割り当てメモリ
  • を使用
  • 関数のパラメータ伝達変数のアドレス
  • クラスのメンバー変数またはメンバー関数
  • を呼び出す

    ✔ 1. 動的に割り当てられたメモリの使用

  • new deleteを使用
    ダイナミックメモリの位置=ヒップホップ
    hipから割当てを取得すると、関数が終了してもメモリ領域から消えないため、返却する必要があります.
  • メモリ容量


    1、コード:プログラムコードを保存する
    2、グローバル:グローバル変数global、静的変数static、配列、構造体構造などの記憶
    3、スタック:関数を呼び出すと、関数のパラメータと領域変数が生成されます.関数呼び出しが終了すると自動的に消えます
    4、臀部:動的配分可能
    newキーワードは割り当てられたメモリのアドレスを返します
    deleteキーを使用して返却されていない場合、メモリが漏洩します.
    const int p1 vs int const p1
    const int* p1
    
    -> p1이 담고자하는 주소에는 const int가 저장되어 있다.
    
    
    
    int* const p1
    
    -> p1이 담고자하는 주소에는 int가 저장되어 있고, 이 값(주소)는 변경할 수 없다.
    

    ✔ 2. 変数のアドレスを関数のパラメータとして渡す


    リファレンスによる呼び出し(リファレンスによる呼び出し)
    1、ポインタを使う
    void func(int* a, int* b){}
    
    int main(){
    int A = 10;
    int B = 20;
    
    func(&A, &B);
    }
    2、使用参考
    void func(int& a, int& b){}
    
    int main(){
    int A = 10;
    int B = 20;
    
    func(A, B);
    }
    2もっときれいです.
    変数のアドレスを関数のパラメータとして渡す

    📒 C-文字列


    c++では、文字列の末尾はNULLで終わる必要があります。


  • 文字列を表す2つの方法.

  • 文字配列を作成し、最後にNULL文字を追加します(NULL文字のASCIIコード値は0です).

  • クラスStringの使用
  • char str[] = "hello";
  • 大文字は小文字のアスキーコード値より小さい.
  • char s1[3] = "cat";
    char s2[6] = "catdog";
    strcmp(s 1,s 2)/strcmpでは、予め定められた基準に従って、s 1が負に等しく、0に等しく、高が負に等しい
    //s 1のt以降の値は0(NULL)であるため、負の値が返される.