[C]二重ポインタ
ダブルポインタ
ポインタ:値(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 -> 20
、num2 -> 10
に変更されます.
整理する
#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
#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
2 D配列ポインタ割当て2 D配列ポインタわりあて:水平サイズ(列)のポインタにのみ割り当てることができます
配分方法:
int (*포인터)[열 크기] = 배열명;
*(포인터 + 1)
:アレイ内の1行をスキップした値を指します.(配列のサイズは+1で実際に計算されたアドレスバイトに依存)(*(포인터 + 1) + 1)
:ポインタがアレイの行をスキップし、列をスキップした値を表します.Reference
この問題について([C]二重ポインタ), 我々は、より多くの情報をここで見つけました https://velog.io/@kimsoyeong/c-이중-인터テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol