c语言的数组注意事项

在C语言中,int()[5]和int是两种完全不同的指针类型,理解它们的区别对于正确处理数组和多维数组至关重要。下面详细解释:

1:int*(指向整型的指针)

  • 含义:指向单个int类型数据的指针
  • 典型用法:
int a = 10;
int* p = &a; // p指向一个int变量
  • 与一维数组的关系:
int arr[5] = {1, 2, 3, 4, 5};
int* p = arr; // arr自动转换为&arr[0],类型是int*

2:int(*)[5](指向数组的指针)

  • 含义:指向一个“包含5个int元素的数组”的指针,而非指向单个int
  • 典型用法:
int arr[5] = {1, 2, 3, 4, 5};
int (*p_to_array)[5] = &arr; // p_to_array指向整个数组
  • 关键区别:
    1:p_to_array的类型是int()[5],表示“指向一个长度为5的int数组的指针”
    2:对p_to_array解引用(p_to_array)会得到整个数组(类型是int[5]),而p_to_array又会自动退化为int
    (指向数组首元素)

3: 为什么&arr的类型是int(*)[5]?

  • arr是一个长度为5的int数组,&arr表示“取整个数组的地址”,因此类型是指向数组的指针(int(*)[5])

  • 这与&arr[0](类型是int*)不同:

printf("%p\n", &arr);    // 类型:int(*)[5],指向整个数组
printf("%p\n", &arr[0]); // 类型:int*,指向首元素
  • 虽然两者的内存地址值相同,但指针类型不同,导致指针运算的行为不同(见下文)。

4: 类型差异导致的指针运算区别

  • int*的算术以int为单位:
int* p = arr;
p++; // 移动sizeof(int)字节(如4字节),指向arr[1]
  • int(*)[5]的算术以“整个数组”为单位:
int (*p_to_array)[5] = &arr;
p_to_array++; // 移动sizeof(int[5])字节(如20字节),指向“下一个长度为5的数组”
  • 如果arr是单独定义的数组,p_to_array++会越界(因为不存在下一个数组)

5:例子1

c语言的数组注意事项_第1张图片

6:例子2,输出结果是相同的

    int arr[5] = {1, 2, 3, 4, 5};
    int (*p_to_array)[5] = &arr; // p_to_array指向整个数组
    printf("%d\n", (*p_to_array)[2]);



    int arr2[5] = {1, 2, 3, 4, 5};
    int *p_to_array2 = &arr2; // p_to_array2指向整个数组
    printf("%d\n", *(p_to_array2+2));

你可能感兴趣的:(c语言,java,开发语言)