陣列的定義與傳遞

2021-10-14 23:16:08 字數 3405 閱讀 1717

陣列的定義

#include

#define max_n 10000000

intmain()

函式內部定義陣列: 在棧區開闢記憶體, 棧區的大小只有8mb;因此函式內部的陣列大小最大只能定義大概200w個整型的大小;不然就爆棧

函式外部定義陣列: 在全域性區上申請記憶體, 且陣列每一位自動初始化為0;

#include

#define max_n 100

int arr[max_n +5]

;int

main()

printf

("%d\n"

, arr[0]

);return0;

}

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-v4aogpvp-1610715942300)(d:\mark文件_date\相簿\image-20210115141349241.png)]

int arr[max_n +5]

;char

*p =

(char

*)arr;

printf

("arr = %p,arr[0] = %p\n"

, arr,

&arr[0]

);printf

("arr + 1 = %p\n"

, arr +1)

;printf

("p = %p, p + 1 = %p\n"

, p, p+1)

;

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-fdy7fqot-1610715942302)(d:\mark文件_date\相簿\image-20210115141926917.png)]

分析得知 : 不同型別的指標進行跳躍的位元組數, 和型別所佔位元組數相關, 但指標 arr從整型指標強轉為char型指標時偏移的量發生變化; 由 偏移4 位元組變為了偏移1位元組;

一維陣列作為函式引數
#include

void

func

(int

*p)int

main()

; arr[0]

=1;func

(arr)

;return0;

}

輸出:

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-cej6yu9n-1610715942304)(d:\mark文件_date\相簿\image-20210115142626396.png)]

我們這裡傳遞的是陣列的位址,因此在函式內部進行修改陣列,外部也一定會發生改變;

#include

void

func

(int

*p)int

main()

; arr[0]

=1;func

(arr)

;printf

("main : arr[0] = %d\n"

, arr[0]

);return0;

}

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-ylrhadit-1610715942306)(d:\mark文件_date\相簿\image-20210115143258815.png)]

*而且在函式中void func(int p)我們傳遞的p實際上是就是指向整型指標變數;

#include

void

func

(int

*p)int

main()

; arr[0]

=1;func

(arr)

;printf

("sizeof(arr) =%lu\n"

,sizeof

(arr));

//這裡我們列印陣列的大小;

return0;

}

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-zncbured-1610715942309)(d:\mark文件_date\相簿\image-20210115144049490.png)]

我們可以明顯的發現p就是乙個針指變數; 因為 p 的表現形式和arr是一樣的, 因此我們將arr的位址賦值給指標p;

#include

void

func

(int

*p)int

main()

; arr[0]

=1;char

*p =

(char

*)arr;

printf

("arr = %p,arr[0] = %p\n"

, arr,

&arr[0]

);printf

("arr + 1 = %p\n"

, arr +1)

;func

(arr)

;printf

("sizeof(arr) =%lu\n"

,sizeof

(arr));

//這裡我們列印陣列的大小;

return0;

}

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-iomaiwhi-1610715942310)(d:\mark文件_date\相簿\image-20210115144651147.png)]

p+1 的偏移量和arr + 1 是一樣的, 表現形式一樣; 因此我們可以這樣去傳參;

高維陣列傳參
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-0c8wlbiy-1610715942310)(d:\mark文件_date\相簿\image-20210115150256273.png)]

arr +1偏移了12位元組, 而p+1 偏移了8位元組, int **p (是乙個指標變數, 變數p中存放的是int *型別的資料)而在 64 位作業系統中乙個指標變數它的大小是8位元組; 因此 p+1 會偏移 8位元組;

#include

#define max_n 100

void

func

(int p[

3])int

main()

注意我們傳遞的引數表現形式一定要是一樣的

陣列的傳遞與複製

基本資料型別中,傳遞的是值 引用資料型別中,傳遞的是在堆中的位址 2.複製 基本資料型別 改變複製的值,不影響原值 var a 10 var b a var b 10 b 30 console.log a,b 10,30引用資料型別 改變複製的值,會影響原值 淺複製 var arr 10,20,30...

C 陣列引用傳遞與指標傳遞

include include include using namespace std class sourcefile explicit sourcefile const char filename data filename const char data int size int main i...

陣列與多維陣列的定義與使用

簡述 陣列是可以用於儲存多個相同型別的資料。陣列的定義分三步 建立物件 分配空間 賦值定義 int a 僅定義乙個陣列物件a。a newint 5 int b newint 5 5代表該陣列的長度 int c 在建立物件時就賦值,可以new int,因為數值時系統會自動根據數值長度分配空間使用 陣列...