C++進級(二)関数、ポインタ、構造体


文書ディレクトリ
  • 関数
  • 関数の宣言
  • 関数のファイル作成
  • ポインタ
  • const修飾ポインタ
  • ポインタと配列
  • ポインタと関数
  • 構造体
  • 定義
  • 構造体配列
  • 構造体ポインタ
  • 構造体ネスト構造体
  • 構造体作関数パラメータ
  • 構造体におけるconstは
  • を用いる.
    関数#カンスウ#
      c++における関数定義には、一般的に5つのステップがある:1.戻り値のタイプ;2.関数名;3.パラメータ表列4.関数体文5.return式.
             (    )
    {
    	     
    	return    
    }
    

      関数が戻り値を必要としない場合は、宣言時にvoidと書けばよい.
    関数の宣言
    関数宣言は、コンパイラの関数名と関数の呼び出し方法を示すものです.関数の実際のボディは、個別に定義できます.これにより、関数はmain関数の後に書くことができます.
    //      ,      
    //  
    int max(int a, int b);
    int max(int a, int b);
    //  
    int max(int a, int b)
    {
    	return a > b ? a : b
    }
    

    関数のファイル作成
      関数のファイル作成には、一般的に4つのステップがあります.
  • は、.hという接尾辞を持つヘッダファイルを作成する.
  • は、.cppという接尾辞のソースファイルを作成します.
  • ヘッダファイルに関数の宣言を書きます.
  • ソースファイルに関数の定義を書きます.
  • //swap.h  
    #include
    using namespace std;
    void swap(int a, int b);
    
    //swap.cpp  
    #include "swap.h"
    void swap(int a, int b)
    {
    	
    }
    

    ししん
     ポインタは、別の変数のアドレス、すなわちメモリ位置の直接アドレスである変数です.他の変数と同様に、使用する前に宣言する必要があります.
    type *var-name;
    

      ある変数のメモリアドレスをvar-nameに割り当てる必要がある場合、変数名に&を付けると、p=&a;のような変数のアドレスが取得されます.ポインタの前に*を付けると、解参照を表し、ポインタが指すメモリのデータが見つかります.
  • 空のポインタ:ポインタ変数は、メモリ内の0と番号付けされた領域を指します.例:int * p = NULL.一般にポインタを初期化するために使用され、空のポインタが指すメモリはアクセスできません.
  • 野ポインタ:ポインタ変数は不正なメモリ領域を指します.たとえばint *p = (int *)0x1100ですが、事前にこのようなメモリスペースを申請していないと、エラーが発生します.

  • const修飾ポインタ
      const修飾ポインタには3つのケースがあります.
  • const修飾ポインタ–定数ポインタ:ポインタの指向は変更できますが、ポインタの指向の値は変更できません.
  • int a =10;
    int b =10;
    int * p = &a 
    const int * p =10; 
    //*p = 20; //  ,           。
    p = &b; //  ,       。
    
  • const修飾定数--ポインタ定数:ポインタ指向は変更できません.ポインタ指向の値は変更できます.
  • int* const p =10; 
    *p = 20; //  ,          。
    //p = &b; //  ,        。
    
  • constはポインタを修飾し、定数を修飾します.ポインタの指向とポインタの指向の値は変更できません.
  • const int* const p = 10;
    *p = 20; //  ,           。
    p = &b; //  ,        。
    

    ポインタと配列
      ポインタを使用して配列内の要素にアクセスします.
    int arr[] = {1,2,3};
    int * p = arr; //       , *p      ,  p++            。
    

    ポインタと関数
      関数パラメータとしてポインタを使用して、実パラメータの値を変更できます.
    //   
    void swap1(int a ,int b)
    {
    	int temp = a;
    	a=b;
    	b=temp;
    }
    //    ,       
    vo1d swap2(int * p1,int *p2)
    {
    	int temp = *p1;
    	*p1 = *p2;
    	*p2 = temp;
    }
    

    こうぞうたい
    定義#テイギ#
      構造体は、ユーザーがカスタマイズしたデータ型に属し、ユーザーが異なるデータ型を格納できるようにします.
  • 構文:struct { };
  • struct student{
    	string name;
    	int age;
    	int score;
    }
    

    構造体を介して変数を作成する方法は、3つあります.
  • struct
  • struct student s1; // c++       struct     
    s1.name = "  ";
    s1.age = 18;
    s1.score = 100;
    
  • struct ={ 1 , 2 ...}
  • struct student s2 ={"  "19100}
    
  • struct student{
    	string name;
    	int age;
    	int score;
    }s3;
    s3.name="  ";
    s3.age=20;
    s3.score=60;
    

    こうぞうたいはいれつ
    カスタマイズされた構造体を配列に入れてメンテナンスを容易にします.
    構文:struct [ ] = {{}, {}, ... {}}
    struct student arr[2]={{"  ", 18, 80},{"  ",19,60}}
    arr[1].name="  ";//        
    

    構造体ポインタ
      オペレータ->は、構造体ポインタを介して構造体属性にアクセスすることができる.
    struct student s ={"  "19100}
    struct student *p = &s; //                   
    p->name; //         
    

    構造体のメンバーには、->オペレータを使用してアクセスできます.
    構造体ネスト構造体
    エンベロープ構造体ネスト構造体は、構造体のメンバーが別の構造体であることを意味する.
    struct teacher{
    	int id; //    
    	string name; //    
    	int age; //  
    	struct student stu; //     
    };
    teacher t;
    t.stu.name = "  " //          
    

    構造体を関数パラメータとする
      は構造体をパラメータとして関数に伝達する.伝達の方式は2種類あります:1.値の転送2.アドレス転送.
    struct student s;
    void printstudent(struct student s){....} //    
    printstudent(s);
    void printstudent2(struct student *p){p->name;....} //    
    printstudent(&s);
    

      同様に、ここでアドレス伝達は実パラメータ値を変更する.
    構造体でのconst使用
    ジルコニウム構造体ではconst tを用いて誤動作を防止することができる.たとえば、構造体の値が関数に渡されると、構造体が関数に渡されるようにコピーされますが、呼び出し回数が多くなるとメモリ領域が大きくなり、
    struct student s ={"  "19100}
    void printstudent2(const struct student *p){p->name;....} //const        
    printstudent(&s);