データ構造(1)


資料構造の学習📚始めましょう.

1.概念と定義


データ構造(Data Structure)はコンピュータです🖥 効率的に管理・構造化するために取り扱う資料の学問です.すなわち,資料を効率的に使用するために,資料の特性に応じて分類,組織,記憶,処理するすべての作業を行う.

2.C言語のポインタ

컴퓨터의 메모리는 데이터를 보관하는 장소 바이트(8 bits) 단위로 주소가 지정됨 **모든 변수는 주소를 가짐**

  • ポインタは、メモリアドレスを値とする変数です.ポインタ変数は次のように宣言されます.type-name * variable-name

  • variable-nameは宣言されたポインタ変数の名前であり、*はvariable-nameがポインタ変数であることを示し、type-nameはポインタ変数variable-nameアドレスに格納されているデータ型を指定します.
  • 演算子&は、変数からアドレスを抽出する演算子です.
  • 3 C言語の配列

    포인터와 배열은 매우 긴밀히 연관되어 있다.例えば、次のように宣言された配列aがあると仮定する.
    int a[10]
  • 配列の名前は、配列の開始アドレスを格納するポインタ変数である.
    (ただし値は変更できません)
  • 4.C言語におけるポインタ演算

  • *aとa[0]は同義語です.
  • であり、a[1]は(a+1)と同じであり、a[i]は(a+1)と同じである.
  • コードを見てみましょう.🧐
  • #include <stdio.h>
    int main()
    {
        int data[] = {1, 2, 3};
        char data2[] = {'a', 'b', 'c'};
        long long data3[] = {1, 2, 3};
        
        int *p = &data[0]; 
        char *q = &data2[0];
        long long *r = &data3[0];
        
        printf("%d %x\n", p, p);
        printf("%d %x\n", p+1, p+1);
        printf("%d %x\n", p+2, p+2);
        
        printf("%d %x\n", q, q);
        printf("%d %x\n", q+1, q+1);
        printf("%d %x\n", q+2, q+2);
    
        printf("%d %x\n", r, r);
        printf("%d %x\n", r+1, r+1);
        printf("%d %x\n", r+2, r+2);
    
        return 0;
    }
    実行結果:215844684 cdd874c 215844688 cdd8750 215844692 cdd8754 215844649 cdd8729 215844650 cdd872a 215844651 cdd872b 215844656 cdd8730 215844664 cdd8738 215844672 cdd8740コードを分析します.
    現在はint,char,long long資料型を用いている.各バイトの大きさから見ると、int는 4bytechar는 1bytelonglong은 8byteである.また%d는 10진수%x는 16진수です.
    したがって,int型のアドレスは4 byteをインクリメント,char型は1 byte,long long型は8 byteとする.

    5.C言語における動的メモリ割当て

  • 変数を宣言するのではなく、プログラムの要求に基づいてメモリを割り当てることができます.
  • これを動的メモリ割り当てと呼びます.
  • malloc関数を呼び出して動的メモリ割り当てを要求すると、必要な緊急メモリが割り当てられ、その開始アドレスが返されます.
  • malloc関数の使用方法について説明します.🤔
    int *p;
    p = (int *)malloc(40);
    上のコードを簡単に理解してみましょう.
    mallocが返すアドレスはタイプのないアドレスです.したがって(int*)は整数を格納するための命令である.
    次に、malloc(40)について説明します.40はバイト単位で割り当てるメモリサイズを指定します.ここでは、10個の整数を格納するために40バイトが必要です.intのバイトサイズは4であるため,10個の配列が生成される.
  • malloc関数を使用すると、配列サイズが不足します.
  • 動的に割り当てられたアレイは、空間が不足している場合に、より大きなアレイを割り当てて使用することができる.
  • 育成配列のコードを簡単に理解しましょう.
     int *array = (int *)malloc(4*sizeof(int));
     
     int * tmp = (int *)malloc(8*sizeof(int));
     int i;
     for(int i = 0; i<4; i++)
         tmp[i] = array[i];
     
     array = tmp;
    最初のコードでは、配列は16バイトのサイズを生成します.sizeof関数はintサイズ4 bバイトを有し、4を乗じたので16バイトである.また,整数(int*)コードを用いたため,アレイには4つの配列が割り当てられた.
    この小さな配列の大きさを大きくするには、任意の配列tmpが必要である.上記のコードから、tmpは8*sizeof(int)のサイズを生成する.つまり32バイトです.8つのアレイのtmpは、コードarray = tmpによってarrayに代入され、arrayは8*sizeof(int)のサイズのアレイとなっている.