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