配列定義と多次元配列の伝達
配列の定義
関数内部定義配列:スタック領域にメモリを開き、スタック領域のサイズは8 MBしかありません.したがって,関数内部の配列サイズは最大で約200 W個の整数型のサイズしか定義できない.さもないと爆発する
関数外部定義配列:グローバル領域でメモリを申請し、配列の各ビットが自動的に0{空}に初期化されます.出力結果 分析によると、異なるタイプのポインタがジャンプするバイト数は、タイプが占めるバイト数と関係があるが、ポインタarrが整数ポインタからchar型ポインタに強く移行するとオフセットの量が変化する.オフセット4バイトからオフセット1バイトに変更されます.
関数パラメータとして1 D配列
ここでは配列のアドレスを渡すので、関数の内部で配列を修正すると、外部も必ず変化します.運転結果 [外部チェーン画像の転送に失敗しました
*そして、関数のvoid func(int p)で私たちが伝えたpは、実際には整数ポインタ変数を指しています.出力 pは針指変数であることが明らかになった.pの表現形式はarrと同じであるため、arrのアドレスをポインタpに付与する.運転結果 p+1のオフセット量はarr+1と同じで、表現形式は同じである.だから私たちはこのように伝参することができます.
高次元配列パラメータは試みを推測して、**pの針で2次元の配列を伝達することができますか、私達はkに来て、まず彼らの表現の形式 を見ます運転結果 arr+1は12バイトオフセットし、p+1は8バイトオフセットし、int**p(ポインタ変数であり、変数pにはint*タイプのデータが格納されている)は64ビットオペレーティングシステムのポインタ変数であり、そのサイズは8バイトである.したがってp+1は8バイトオフセットする.では、2 D配列のパラメータをどのように伝達しますか?
[外部チェーン画像の転送に失敗しました.ソース局には盗難防止チェーン機構がある可能性があります.画像を保存して直接アップロードすることをお勧めします(img-nalLqFJcM-161579363015)(D:Markドキュメント_date図庫image-2101151328861.png)]
二次元配列を伝達する方法二
私たちが伝えたパラメータの表現形式は必ず同じであることに注意してください.列3 D配列 を渡すように分析運転結果 [外部リンク画像の転送に失敗しました.ソース局に盗難防止チェーン機構がある可能性があります.画像を保存して直接アップロードすることをお勧めします(img-QImuQp 1 H-161579615877)(D:Markドキュメント_date図庫image-2101155936210.png)]]分析運転結果 ここでp+1のオフセット量は24バイトで、ちょうど3*2とint型が占める空間に等しい.
#include
#define MAX_N 10000000
int main() {
int arr[MAX_N + 5];
printf("%d
", arr[0]);
return 0;
}
関数内部定義配列:スタック領域にメモリを開き、スタック領域のサイズは8 MBしかありません.したがって,関数内部の配列サイズは最大で約200 W個の整数型のサイズしか定義できない.さもないと爆発する
関数外部定義配列:グローバル領域でメモリを申請し、配列の各ビットが自動的に0{空}に初期化されます.
#include
#define MAX_N 100
int arr[MAX_N + 5];
int main() {
printf("arr = %p , arr[0] = %p
", arr, &arr[0]);
//arr arr[0]
for (int i = 0; i < MAX_N; i++) {
scanf("%d", arr + i);
// scanf("%d", &arr[i]);
}
printf("%d
", arr[0]);
return 0;
}
int arr[MAX_N + 5];
char *p = (char *)arr;
printf("arr = %p,arr[0] = %p
", arr, &arr[0]);
printf("arr + 1 = %p
", arr +1);
printf("p = %p, p + 1 = %p
", p, p+1);
関数パラメータとして1 D配列
#include
void func(int *p) {
printf("p[0] = %d
", p[0]);
return ;
}
int main() {
int arr[1000] = {
0};
arr[0] = 1;
func(arr);
return 0;
}
ここでは配列のアドレスを渡すので、関数の内部で配列を修正すると、外部も必ず変化します.
#include
void func(int *p) {
printf("p[0] = %d
", p[0]);
p[0] = 123;
return ;
}
int main() {
int arr[1000] = {
0};
arr[0] = 1;
func(arr);
printf("main : arr[0] = %d
", arr[0]);
return 0;
}
*そして、関数のvoid func(int p)で私たちが伝えたpは、実際には整数ポインタ変数を指しています.
#include
void func(int *p) {
printf("p[0] = %d
", p[0]);
p[0] = 123;
printf("sizeof(p) = lu
", sizeof(p));// p , sizeof , %lu;
return ;
}
int main() {
int arr[105] = {
0};
arr[0] = 1;
func(arr);
printf("sizeof(arr) =%lu
", sizeof(arr));// ;
return 0;
}
#include
void func(int *p) {
printf("p[0] = %d
", p[0]);
p[0] = 123;
printf("p = %p, p + 1 = %p
", p ,p+1);
printf("sizeof(p) = lu
", sizeof(p));// p , sizeof , %lu;
return ;
}
int main() {
int arr[105] = {
0};
arr[0] = 1;
char *p = (char *)arr;
printf("arr = %p,arr[0] = %p
", arr, &arr[0]);
printf("arr + 1 = %p
", arr +1);
func(arr);
printf("sizeof(arr) =%lu
", sizeof(arr));// ;
return 0;
}
高次元配列パラメータ
#include
#define MAX_N 100
int main() {
int arr[MAX_N + 5][3];
int **p;
printf("arr = %p, arr[0] = %p
", arr, &arr[0]);
printf("arr + 1 = %p
", arr+1);
printf("p = %p, p + 1 = %p
",p , p+1);
return 0;
}
#include
#define MAX_N 100
void func(int (*p)[3]) {
// (3 int ) ;
printf("p = %p, p + 1 = %p
", p, p+1);
printf("sizeof(p) = %lu
", sizeof(p));
return ;
}
int main() {
int arr[MAX_N + 5][3];
printf("arr = %p, arr[0] = %p
", arr, &arr[0]);
printf("arr + 1 = %p
", arr+1);
func(arr);
printf("sizeof(arr) = %lu
", sizeof(arr));
return 0;
}
運転結果[外部チェーン画像の転送に失敗しました.ソース局には盗難防止チェーン機構がある可能性があります.画像を保存して直接アップロードすることをお勧めします(img-nalLqFJcM-161579363015)(D:Markドキュメント_date図庫image-2101151328861.png)]
#include
#define MAX_N 100
void func(int p[][3]) {
// p[][3], ;
printf("p = %p, p + 1 = %p
", p, p+1);
//printf("sizeof(p) = %lu
", sizeof(p)); ,p
return ;
}
int main() {
int arr[MAX_N + 5][3];
printf("arr = %p, arr[0] = %p
", arr, &arr[0]);
printf("arr + 1 = %p
", arr+1);
func(arr);
printf("sizeof(arr) = %lu
", sizeof(arr));
return 0;
}
私たちが伝えたパラメータの表現形式は必ず同じであることに注意してください.
#include
#define MAX_N 100
//void func(int (*p)[3][2])
void func(int p[][3][2]) {
// p[][3], ;
printf("p = %p, p + 1 = %p
", p, p+1);
//printf("sizeof(p) = %lu
", sizeof(p)); ,p ;
return ;
}
int main() {
int arr[MAX_N + 5][3][2];
printf("arr = %p, arr[0] = %p
", arr, &arr[0]);
printf("arr + 1 = %p
", arr+1);
func(arr);
printf("sizeof(arr) = %lu
", sizeof(arr));
return 0;
}
printf("arr = %p, arr[0] = %p
", arr, &arr[0]);
printf("arr + 1 = %p
", arr+1);
func(arr);
printf("sizeof(arr) = %lu
", sizeof(arr));
return 0;
}