【问题标题】:c pointers and pointers to arraysc指针和指向数组的指针
【发布时间】:2023-03-11 14:58:01
【问题描述】:

我在网上看到了这段代码。我只是不明白这里发生了什么。

#include <stdio.h>
#include <math.h>

main()
{
    int arr [ ][3] = {{11,12,13}, {21,22,23},{31,32,33},{41,42,43},{51,52,53}};
    int I , j ;
    int  *p ,  (*q) [3], *r ;
    p = (int *) arr ;
    q = arr;
    r = (int *) q ;
    printf ("  %u  %u  %d  %d  %d  %d \n  ", p, q, *p, *(r), *(r+1), *(r+2));
    p++ ;
    q++ ;
    r = (int *) q ;
    printf ("  %u  %u  %d  %d  %d  %d \n  ", p, q, *p, *(r), *(r+1), *(r+2));
}

我知道 p 和 r 是指针,q 是指向数组的指针,但是 p = (int *) arr 是什么意思;什么意思?这句话的目的是什么?

【问题讨论】:

  • p = (int *) arr; 将数组地址转换为p。强制转换是必要的,因为它们具有不同的间接级别。
  • Arr 不是指针,它是一个值序列。实际上是一个二维数组。 P 设置为指向该数组的第一个元素(存储值的位置)。此代码允许您查看二维数组的值是如何存储在内存中的。
  • 这就是我说“数组地址”的原因,但是当我删除强制转换时,我的 MSVC 编译器认为它是一个指针。 warning C4047: '=' : 'int *' differs in levels of indirection from 'int (*)[3]'
  • @WeatherVane arr 在这种情况下衰减为一个指针,但它是指向int * 的不兼容类型的指针

标签: c arrays pointers


【解决方案1】:
表达式中的

arr 隐式转换为指向其第一个元素的指针。由于arr 的元素具有int[3] 类型,则arr 被转换为int ( * )[3]

下面的代码sn-p演示了这种隐式转换

int  (*q) [3];

q = arr;

声明

 p = (int *) arr;

表示在转换后重新解释具有 int ( * )[3] 类型的arr,如int *

( int * )arr 之前表示所谓的转换,即重新解释。

现在二维数组arr占用的内存被重新解释为类型为int [15]的一维数组占用的内存,p指向这个假想数组的第一个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2013-04-19
    • 2017-09-03
    • 2013-04-29
    相关资源
    最近更新 更多