Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数组作为指针_C++_C - Fatal编程技术网

C++ 数组作为指针

C++ 数组作为指针,c++,c,C++,C,显示的输出为-28-28-28-28。 a的地址是-28,它指向-28。这是什么?如果可能的话,请用图表解释一下 格式说明符%d用于类型int。您给它一些其他类型,因此,程序的行为是未定义的。您可能希望尝试%p(尽管它可能会显示类似的结果,此时您需要开始了解指针是关于什么的)。欢迎来到数组指针衰减的深度。结果是: x的类型是一个3D数组,int()[2][2][2] 如果你获取它的地址,没有什么特别的事情发生,你会得到一个指向该数组的指针,即。e&x的类型为int(*)[2][2][2] 然而,

显示的输出为-28-28-28-28。 a的地址是-28,它指向-28。这是什么?如果可能的话,请用图表解释一下


格式说明符
%d
用于类型
int
。您给它一些其他类型,因此,程序的行为是未定义的。您可能希望尝试
%p
(尽管它可能会显示类似的结果,此时您需要开始了解指针是关于什么的)。

欢迎来到数组指针衰减的深度。结果是:

  • x
    的类型是一个3D数组,
    int()[2][2][2]

  • 如果你获取它的地址,没有什么特别的事情发生,你会得到一个指向该数组的指针,即。e
    &x
    的类型为
    int(*)[2][2][2]

  • 然而,在大多数其他上下文中,数组不是直接使用的,它们首先衰减为指向第一个元素的指针。因此,在表达式
    *x
    中,
    x
    首先衰减为
    int(*)[2][2]
    类型的指针(3D数组的第一个元素是2D数组)。然后取消对该指针的引用以生成2D数组
    int()[2][2]

  • 由于首先存储3D阵列的第一个片,因此其地址与3D阵列的地址相同。即
    &x
    &x
    产生相同的地址

  • 第二次取消引用时也会发生同样的情况,
    &**x
    给出3D数组中第一行的地址(其类型为
    int(*)[2]

  • 同样,第三次取消引用时也会发生同样的情况,
    &***x
    是数组中第一个元素的地址(其类型为
    int*


  • 数组指针衰减机制允许C严格按照指针算法定义数组下标运算符。关键是,所涉及的三种数组类型都有不同的大小,这允许编译器推断正确的偏移量。即
    sizeof(*x)
    4*sizeof(int)
    (记住
    *x
    的类型是
    int()[2][2]
    ),
    sizeof(**x)
    2*sizeof(int)
    。因此,
    x[1][0]
    x[0][1]
    解析为3D阵列中的两个不同线阵列。

    结果相同,但类型不同,如下所示。 您首先必须知道,“T型数组的n个元素”类型的表达式已衰减 转换为“T型指针”,但数组是&、sizeof运算符的操作数或字符串文字时除外

    表情

    int main()
    {
       int x[2][2][2]={1,2,3,4,5,6,7,8};
       printf("%d%d%d%d",&x,&*x,&**x,&***x);
    }
    
    在上述情况下,您总是使用
    &
    运算符,这意味着表达式不会退化为前面解释的“T型指针”。 请注意,所有的输出都是相同的,但它们的类型不同,并且输出将是数组的基址。下面是区别,如果你写

    &a  // type is  int(*)[2][2][2]
    &*a // type is int(*)[2][2]
    &**a // type is int(*)[2]
    &***a // type is int  *
    
    现在如果你这样做了

    int (*p)[2][2][2] = &a; // note types are same as shown above
    //print p here
    
    p++;
    printf("%p",p);
    
    请注意
    p
    的两个值之间的差异。然后您必须注意到
    p
    跳过整个数组,即全部8个元素。 如果你这样做了

    int (*p)[2][2][2] = &a; // note types are same as shown above
    //print p here
    
    p++;
    printf("%p",p);
    

    int (*q)[2][2] =  &*a;    // note types are same
    
    之后你会

    int(*q)[2][2] = &a[0];
    
    然后打印
    q
    ,注意原始
    q
    和更新的
    q
    的值之间的差异。您会发现它现在指向内存中下一个位置4。 这就是区别。
    另外,将问题中的
    %d
    更改为
    %p

    您应该展示对问题的最低理解。。请分享你的想法。你的代码在做什么?如果这是可以理解的,我们也许可以帮助!1.发布实际代码,而不是虚构的东西。2.将指针打印为指针。3.数组不是指针。就我所见,
    a
    在问题代码中是未定义的。所以输出应该是您描述的(或者任何东西,除了编译器错误)。您希望实现什么?