【问题标题】:Pointer to an 2D array increment in c指向 c 中二维数组增量的指针
【发布时间】:2021-06-23 16:21:34
【问题描述】:
#include<stdio.h>
int main()
{
    int arr[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    printf("%u ,%u\n",arr, &arr+1);
    return 0;
}

在打印语句中:(假设整数大小为4字节)
设 arr 的内存位置为 1000

arr+1--给出 1016(即下一行内存)

1000 1004 1008 1012 1016

1     2     3    4    5

&arr+1 给出 1048

我理解逻辑,但我不明白编译器如何将
arr 识别为“指向 4 个整数数组的指针”&arr as 'pointer to array of 3 arrays of 4 integer'

即使两者在递增之前都指向同一个地址(1000)

【问题讨论】:

  • arr 衰减为与&amp;arr[0] 相同的类型,这是一个由 4 个整数组成的数组。另一方面,&amp;arr 是指向 3 x 4 整数数组的指针
  • &amp;arr 给你一个指向数组的指针。 arr 给你一个指向数组第一个元素的指针。

标签: arrays c pointers implicit-conversion pointer-arithmetic


【解决方案1】:

arrint 的 4 元素数组的 3 元素数组。

表达式中的数组会自动转换为指向数组第一个元素的指针(存在一些例外)。因此arr 被转换为指向其第一个元素的指针。第一个元素的类型是“int 的 4 元素数组,因此 arr 被转换为“指向int 的 4 元素数组的指针”(int(*)[4])。

一元&amp;(地址)运算符的操作数是例外之一。 arrint 的4 元素数组的3 元素数组,所以&amp;arr 是“指向int 的4 元素数组的3 元素数组的指针”。

注意这一行

printf("%u ,%u\n",arr, &arr+1);

通过将类型错误的数据传递给printf() 来调用未定义的行为%u 期望 unsigned int。您应该将指针转换为 void* 并使用 %p 来打印这样的指针:

printf("%p ,%p\n",(void*)arr, (void*)(&arr+1));

或者,您可以将指针转换为整数(以实现定义的方式)并打印它们。

#include<stdio.h>
#include<inttypes.h>
int main(void)
{
    int arr[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    printf("%" PRIuPTR " ,%" PRIuPTR "\n",(uintptr_t)arr, (uintptr_t)(&arr+1));
    return 0;
}

【讨论】:

    【解决方案2】:

    在表达式中使用的数组指定被转换为指向它们的第一个元素的指针。

    所以数组arr 声明为

    int arr[3][4] = { /*...*/ };
    

    被用作 printf 调用的参数时,它被转换为指向其第一个元素的指针。数组元素的类型是int[4]。所以指向该类型对象的指针的类型为int ( * )[4]

    另一方面,表达式&amp;arr 的类型为int ( * )[3][4]。像&amp;arr + 1 这样递增指针会产生比表达式&amp;arr 的值大sizeof( int[3][4] ) 的值(即等于12 * sizeof( int ))。

    注意,你必须使用转换说明符%p来输出指针的值。

    printf("%p ,%p\n", (void * )arr, ( void * )( &arr+1 ) );
    

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多