配列定義と多次元配列の伝達


配列の定義
#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);
  • 出力結果
  • 分析によると、異なるタイプのポインタがジャンプするバイト数は、タイプが占めるバイト数と関係があるが、ポインタarrが整数ポインタからchar型ポインタに強く移行するとオフセットの量が変化する.オフセット4バイトからオフセット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; }
  • 出力
  • pは針指変数であることが明らかになった.pの表現形式はarrと同じであるため、arrのアドレスをポインタpに付与する.
    #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; }
  • 運転結果
  • p+1のオフセット量はarr+1と同じで、表現形式は同じである.だから私たちはこのように伝参することができます.
    高次元配列パラメータ
  • は試みを推測して、**pの針で2次元の配列を伝達することができますか、私達はkに来て、まず彼らの表現の形式
    #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; }
  • を見ます
  • 運転結果
  • arr+1は12バイトオフセットし、p+1は8バイトオフセットし、int**p(ポインタ変数であり、変数pにはint*タイプのデータが格納されている)は64ビットオペレーティングシステムのポインタ変数であり、そのサイズは8バイトである.したがってp+1は8バイトオフセットする.
  • では、2 D配列のパラメータをどのように伝達しますか?
    #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; }

    私たちが伝えたパラメータの表現形式は必ず同じであることに注意してください.
  • 列3 D配列
  • を渡すように
    #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; }
  • 分析運転結果
  • [外部リンク画像の転送に失敗しました.ソース局に盗難防止チェーン機構がある可能性があります.画像を保存して直接アップロードすることをお勧めします(img-QImuQp 1 H-161579615877)(D:Markドキュメント_date図庫image-2101155936210.png)]]
        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; }
  • 分析運転結果
  • ここでp+1のオフセット量は24バイトで、ちょうど3*2とint型が占める空間に等しい.