【426】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 2019-07-24 11:24 McDelfino 阅读(2406) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)