c——复合类型——数组
来源:互联网 发布:软考中级数据库工程师 编辑:程序博客网 时间:2024/05/16 12:20
概述
只有一维数组,n(n > 1)维数组本质是一维数组,只不过这个一维数组的数组元素类型为n - 1维数组
数组
一维数组
void one_dim_array(){ int arr[3] = {1, 2, 3}; printf("sizeof(arr) = %ld, sizeof(int[3]) = %ld, sizeof(arr[0]) = %ld\n", sizeof(arr), sizeof(int[3]), sizeof(arr[0])); printf("&arr = %p, &arr + 1 = %p\n", &arr, &arr + 1); printf("arr = %p, arr + 1 = %p\n", arr, arr + 1); printf("&arr[0] = %p, &arr[0] + 1 = %p\n", &arr[0], &arr[0] + 1); printf("arr[1] = %d, *(arr + 1) = %d\n", arr[1], *(arr + 1));}
output:
sizeof(arr) = 12, sizeof(int[3]) = 12, sizeof(arr[0]) = 4&arr = 0x7fff5fbff810, &arr + 1 = 0x7fff5fbff81carr = 0x7fff5fbff810, arr + 1 = 0x7fff5fbff814&arr[0] = 0x7fff5fbff810, &arr[0] + 1 = 0x7fff5fbff814arr[1] = 2, *(arr + 1) = 2
结论:
- 数组arr类型为int[3],数组字长为sizeof(arr) = sizeof(int[3]) = sizeof(int) * 3,&arr类型为int (*)[3],&arr递增1,值递增sizeof(arr) ,&arr表示数组首地址
- 数组元素arr[0]类型为int,数组元素字长为sizeof(arr[0]) = sizeof(int),&arr[0]类型为int *,&arr[0]递增1,值递增sizeof(arr[0]),&arr[0]值为数组首地址
- 数组arr作为操作数时,隐式转换为int*,即数组元素类型指针,指向数组第一个元素
- arr[n]与*(arr + n)等价
多维数组
void multi_dim_array(){ int arr[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; printf("sizeof(arr) = %ld, sizeof(int[3][4]) = %ld, sizeof(arr[0]) = %ld\n", sizeof(arr), sizeof(int[3][4]), sizeof(arr[0])); printf("&arr = %p, &arr + 1 = %p\n", &arr, &arr + 1); printf("arr = %p, arr + 1 = %p\n", arr, arr + 1); printf("&arr[0] = %p, &arr[0] + 1 = %p\n", &arr[0], &arr[0] + 1); printf("arr[1] = %p, *(arr + 1) = %p\n", arr[1], *(arr + 1)); printf("sizeof(arr[0]) = %ld, sizeof(int[4]) = %ld, sizeof(arr[0][0]) = %ld\n", sizeof(arr[0]), sizeof(int[4]), sizeof(arr[0][0])); printf("&arr[0] = %p, &arr[0] + 1 = %p\n", &arr[0], &arr[0] + 1); printf("arr[0] = %p, arr[0] + 1 = %p\n", arr[0], arr[0] + 1); printf("&arr[0][0] = %p, &arr[0][0] + 1 = %p\n", &arr[0][0], &arr[0][0] + 1); printf("arr[0][1] = %d, *(arr[0] + 1) = %d\n", arr[0][1], *(arr[0] + 1));}
output:
sizeof(arr) = 48, sizeof(int[3][4]) = 48, sizeof(arr[0]) = 16&arr = 0x7fff5fbff7e0, &arr + 1 = 0x7fff5fbff810arr = 0x7fff5fbff7e0, arr + 1 = 0x7fff5fbff7f0&arr[0] = 0x7fff5fbff7e0, &arr[0] + 1 = 0x7fff5fbff7f0arr[1] = 0x7fff5fbff7f0, *(arr + 1) = 0x7fff5fbff7f0sizeof(arr[0]) = 16, sizeof(int[4]) = 16, sizeof(arr[0][0]) = 4&arr[0] = 0x7fff5fbff7e0, &arr[0] + 1 = 0x7fff5fbff7f0arr[0] = 0x7fff5fbff7e0, arr[0] + 1 = 0x7fff5fbff7e4&arr[0][0] = 0x7fff5fbff7e0, &arr[0][0] + 1 = 0x7fff5fbff7e4arr[0][1] = 2, *(arr[0] + 1) = 2
结论:
- 数组arr类型为int[3][4],数组字长为sizeof(arr) = sizeof(int[3][4]) = sizeof(int[4]) * 3,&arr类型为int (*)[3][4],&arr递增1,值递增sizeof(arr) ,&arr表示数组首地址
- 数组元素arr[0]类型为int[4],数组元素字长为sizeof(arr[0]) = sizeof(int[4]),&arr[0]类型为int (*)[4],&arr[0]递增1,值递增sizeof(arr[0]),&arr[0]值为数组首地址
- 数组arr作为操作数时,隐式转换为int (*)[4],即数组元素类型指针,指向数组第一个元素
- arr[n]与*(arr + n)等价
数组参数
数组参数,不管是形参或实参,作为函数操作符操作数,隐式转换数组元素类型指针:
- 数组作为形参时,形参类型为数组元素类型指针,因此第一维数组长度无意义(可omit,也应该omit,否则易混淆),大于一维的数组长度不能omit(表示数组元素类型)
- 数组作为实参时,实参类型为数组元素类型指针,指向数组第一个元素
void feed1(int food[]){ printf("feed1\n");}void feed2(int food[][4]){ printf("feed2\n");}void call_feed(){ int food1[3] = {1, 2, 3}; int food2[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; feed1(food1); feed2(food2);}
解释:
- feed1形参类型为int*,调用feed1传递实参类型为int*
- feed2形参类型为int (*)[4],调用feed2传递实参类型为int (*)[4]
0 0
- c——复合类型——数组
- Go基础编程:复合类型—数组
- 学习C++——复合类型
- 复合类型 —— 引用
- 复合类型 —— 指针
- c——复合类型——指针
- c——复合类型——字符串
- c——复合类型——函数
- c——隐式转换——复合类型
- c——运算符——复合类型
- C语言学习笔记(五)——复合类型
- 第4章——复合类型
- 结构——复合值类型
- 枚举——复合值类型
- 复合类型——引用、指针
- 复合类型——指针和引用
- Go基础编程:复合类型—指针
- Go基础编程:复合类型—map
- Maven Profile 多环境构建
- 聊聊高并发系统之限流特技-2
- OpenCV学习笔记(01) :读取图片并显示
- 安卓_侧滑菜单
- C++的static_cast作用
- c——复合类型——数组
- Maven
- 2017.1.13【初中部 】普及组模拟赛C组 excel 电子表格 题解
- mysql sql语句大全
- 13.2 连接到世界银行
- 递归和动态规划专题(二)----剑指offer+左程云算法
- 汇编实验16 编写包含多个功能子程序的中断例程——浅谈直接地址表
- open() close() 函数的使用
- 49个常用sql语句