alex_bn_lee

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

【426】C 传递数组给函数

参考:C 传递数组给函数

参考:C语言二维数组作为函数参数传递

参考:二维数组作为函数参数传递剖析(C语言)(6.19更新第5种)


 

总结:

一维数组参数,可以是地址、arr[]、arr[n]

二维数组比较复杂,需要提供列的值,否则会报错,可参考上面的网址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <stdio.h>
#include <stdlib.h>
 
void myFunc1(int length, int *arr) {
    for (int i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return;
}
 
void myFunc2(int length, int arr[]) {
    for (int i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return;
}
 
void myFunc3(int length, int arr[length]) {
    for (int i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return;
}
 
void myFunc4(int row, int column, int *arr2) {
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < column; j++) {
            printf("arr2[%d][%d] = %d   ", i, j, *(arr2 + i*column + j));
        }
        printf("\n");
    }
    return;
}
 
void myFunc5(int row, int column, int arr2[][column]) {
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < column; j++) {
            printf("arr2[%d][%d] = %d   ", i, j, arr2[i][j]);
        }
        printf("\n");
    }
    return;
}
 
int main() {
    int arr[5] = {1, 2, 3, 4, 5};
     
    printf("Parameter is pointer:\n");
    myFunc1(5, &arr[0]);    // ok with arr
     
    printf("Parameter is array[]:\n");
    myFunc2(5, &arr[0]);    // ok with arr
     
    printf("Parameter is array[length]:\n");
    myFunc3(5, &arr[0]);    // ok with arr
     
    int arr2[2][3] = {{1, 2, 3}, {4, 5, 6}};
     
    printf("Parameter is pointer:\n");
    myFunc4(2, 3, arr2[0]); // &arr2[0][0] is ok, but arr2 is not ok
                            // *arr2 is ok.
                            // but actually they have the same address
     
    printf("Parameter is pointer:\n");
    myFunc5(2, 3, arr2);    // not ok with arr2[0]
                            // not ok with &arr2[0][0]
     
    printf("\narr2                           = %p\n", arr2);
    printf("arr2[0]                        = %p\n", arr2[0]);
    printf("*arr2 = arr2[0]                = %p\n", *arr2);
    printf("arr2[0][0]                     = %p\n", &arr2[0][0]);
    printf("**arr2 = *arr2[0] = arr2[0][0] = %p\n\n", &arr2[0][0]);
     
     
    printf("address of this two-dimentional array:\n");
    printf("arr2           = %p\n", arr2);
    for (int i = 0; i < 2; i++) {
        printf("  arr2[%d]      = %p\n", i, arr2[0]);
        for (int j = 0; j < 3; j++) {
            printf("    arr2[%d][%d] = %p   ", i, j, &arr2[i][j]);
        }
        printf("\n");
    }
     
    printf("we can use the unexisted element, interesting!\n");
    printf("*arr2 means arr2[0], the first row.\n");
    printf("**arr2 means *arr2[0] means arr2[0][0], the first element of the first row.\n");
    printf("arr2[1][0]               = %d\n", arr2[1][0]);
    printf("arr2[0][3]               = %d\n", arr2[0][3]);
    printf("*(*(arr2 + 1) + 0)       = %d\n", *(*(arr2 + 1) + 0));
    printf("*(*(arr2 + 0) + 3)       = %d\n", *(*(arr2 + 0) + 3));
    printf("*(arr2[0] + 1*3 + 0)     = %d\n", *(arr2[0] + 1*3 + 0));
    printf("*(*arr2 + 1*3 + 0)       = %d\n", *(*arr2 + 1*3 + 0));
    printf("*(&arr2[0][0] + 1*3 + 0) = %d\n", *(&arr2[0][0] + 1*3 + 0));
    printf("*(&arr2[0][0] + 3)       = %d\n", *(&arr2[0][0] + 3));
     
    return 0;
}

output:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Parameter is pointer:
1 2 3 4 5
Parameter is array[]:
1 2 3 4 5
Parameter is array[length]:
1 2 3 4 5
Parameter is pointer:
arr2[0][0] = 1   arr2[0][1] = 2   arr2[0][2] = 3  
arr2[1][0] = 4   arr2[1][1] = 5   arr2[1][2] = 6  
Parameter is pointer:
arr2[0][0] = 1   arr2[0][1] = 2   arr2[0][2] = 3  
arr2[1][0] = 4   arr2[1][1] = 5   arr2[1][2] = 6  
 
arr2                           = 0x7ffc6bdc38a0
arr2[0]                        = 0x7ffc6bdc38a0
*arr2 = arr2[0]                = 0x7ffc6bdc38a0
arr2[0][0]                     = 0x7ffc6bdc38a0
**arr2 = *arr2[0] = arr2[0][0] = 0x7ffc6bdc38a0
 
address of this two-dimentional array:
arr2           = 0x7ffc6bdc38a0
  arr2[0]      = 0x7ffc6bdc38a0
    arr2[0][0] = 0x7ffc6bdc38a0       arr2[0][1] = 0x7ffc6bdc38a4       arr2[0][2] = 0x7ffc6bdc38a8  
  arr2[1]      = 0x7ffc6bdc38a0
    arr2[1][0] = 0x7ffc6bdc38ac       arr2[1][1] = 0x7ffc6bdc38b0       arr2[1][2] = 0x7ffc6bdc38b4  
we can use the unexisted element, interesting!
*arr2 means arr2[0], the first row.
**arr2 means *arr2[0] means arr2[0][0], the first element of the first row.
arr2[1][0]               = 4
arr2[0][3]               = 4
*(*(arr2 + 1) + 0)       = 4
*(*(arr2 + 0) + 3)       = 4
*(arr2[0] + 1*3 + 0)     = 4
*(*arr2 + 1*3 + 0)       = 4
*(&arr2[0][0] + 1*3 + 0) = 4
*(&arr2[0][0] + 3)       = 4

 

posted on   McDelfino  阅读(2406)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示