[C]二重ポインタ

9734 ワード

ダブルポインタ


ポインタ:値(value)のアドレスを指す変数
ダブルポインタデュアルポインタ:ポインタが値
配列内の配列のアドレス値は、0番目のインデックスのアドレスと同じです.

2 Dアレイでは?


2 D配列arrが存在する場合、arrおよびarr[0]およびarr[0][0]のアドレス値は同じである.
すなわち、配列arrはarr[0]のアドレス値を有し、arr[0]はarr[0][0]のアドレス値を有する.

ポインタ演算

#include <stdio.h>

int main()
{
	int arr[2][3] = { {1, 2, 3}, {11, 12, 13} };

	printf("arr       : %d\n", arr);
	printf("arr+1     : %d\n\n", arr+1);

	printf("arr[0]    : %d\n", arr[0]);
	printf("arr[0]+1  : %d\n", arr[0]+1);
}
👉 出力結果
arr       : 5242464
arr+1     : 5242476
arr[0]    : 5242464
arr[0]+1  : 5242468
1次元配列の場合、アドレス値+1演算で4が増加します.

しかし、なぜarr+1は12増加するのでしょうか。


上記で宣言したarr配列はrow 2, col 3サイズです.
したがって、4 byteは、3個(col)毎に1行を構成する.
したがって、アドレス値+1は12(4 byte * 3)増加する.

ダブルポインタ関数

#include <stdio.h>

void swap(int** num1, int** num2);

int main()
{
    int num1 = 10;
    int num2 = 20;

    int* point_num1 = &num1;
    int* point_num2 = &num2;

    printf("변경전\n");
    printf("num1 : %d\n", *point_num1);
    printf("num2 : %d\n\n", *point_num2);

    swap(&point_num1, &point_num2);

    printf("변경전\n");
    printf("num1 : %d\n", *point_num1);
    printf("num2 : %d\n\n", *point_num2);
}

void swap(int** num1, int** num2) 
{
    int* tmp;        
    tmp = *num1;
    *num1 = *num2;
    *num2 = tmp;
}
👉 出力結果
// 변경 전
num1 : 10
num2 : 20

// 변경 후
num1 : 20
num2 : 10
swap関数が実行されると、ポインタtmpが追加され、各変数のアドレス値がnum1 -> 20num2 -> 10に変更されます.

整理する


  • 2 D配列ポインタ割当て2 D配列ポインタわりあて:水平サイズ(列)のポインタにのみ割り当てることができます

  • 配分方法:int (*포인터)[열 크기] = 배열명;
  • *(포인터 + 1):アレイ内の1行をスキップした値を指します.(配列のサイズは+1で実際に計算されたアドレスバイトに依存)
  • (*(포인터 + 1) + 1):ポインタがアレイの行をスキップし、列をスキップした値を表します.