当前位置: 首页 > 知识库问答 >
问题:

为什么我取消引用一个数组指针,结果值是指向数组第一个元素的指针,而不是整个数组对象?

余阳秋
2023-03-14
#include<iostream>

int num[3]={66,77,88};

int main()

{

        int(*pi)[3]=&num;                                                                                                       
        std::cout<<*pi;

}                  

结果是地址而不是数组。怎么解释?

共有2个答案

晏晨朗
2023-03-14

就像cout不能打印向量一样,它也不能打印数组。然而,cout将打印第一个元素的地址。

如果您查看一下iostream的源代码,它们提到cout作为指针https://code.woboq.org/llvm/libcxx/src/iostream.cpp.html,这也是为什么您总是需要迭代数组的每个项,而不是其他语言(如Rust)可以打印向量或数组的原因。

对于string,有一个例外,因为在C和C++中它们是(或者应该是!)空终止,这就是打印整个char数组的原因。但是0是一个有效的数字,因此没有办法知道int数组的边界,除非您可以在编译时检测到它(Rust做到了)。

晋奕
2023-03-14

不是整个数组对象?

*pi给出数组,即int[3]。但是std::basic_ostream运算符<<没有重载取数组,但有一个重载取指针(const void*),则发生数组到指针的衰减,转换后的指针(int*)指向数组的第一个元素,然后转换为const void*,然后传递给std::cout并打印出来。

有一个从数组类型的lvalues和rvalues到指针类型的rvalues的隐式转换:它构造一个指向数组第一个元素的指针。每当数组出现在不需要数组的上下文中,但指针为:

 类似资料:
  • 如果一个数组中的所有元素保存的都是 指针,那么我们就称它为 指针数组。指针数组的定义形式一般为: dataType *arrayName[length]; 的优先级高于 ,该定义形式应该理解为: dataType *(arrayName[length]); 括号里面说明 是一个数组,包含了 个元素,括号外面说明每个元素的类型为 。 除了每个元素的数据类型不同,指针数组和普通数组在其他方面都是一样的

  • 主要内容:关于数组指针的谜题数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。以 为例,该数组在内存中的分布如下图所示: 定义数组时,要给出数组名和数组长度,数组名可以认为是一个 指针,它指向数组的第 0 个元素。 在C语言中,我们将第 0 个元素的地址称为数组的首地址。以上面的数组为例,下图是 arr 的指向:

  • 6. 指向指针的指针与指针数组 指针可以指向基本类型,也可以指向复合类型,因此也可以指向另外一个指针变量,称为指向指针的指针。 int i; int *pi = &i; int **ppi = &pi; 这样定义之后,表达式*ppi取pi的值,表达式**ppi取i的值。请读者自己画图理解i、pi、ppi这三个变量之间的关系。 很自然地,也可以定义指向“指向指针的指针”的指针,但是很少用到: int

  • 本文向大家介绍指针数组、数组指针、函数指针的区别?相关面试题,主要包含被问及指针数组、数组指针、函数指针的区别?时的应答技巧和注意事项,需要的朋友参考一下 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。 数组指针:首先它是一个指针,它指向一个数组。在32

  • 我正在为一个Delphi可执行文件开发一个C++的DLL项目。此可执行文件具有如下结构: 例如: 我试着做了这样的课程: 它给了我这个: 那不是我想要的。 我可以通过使用一个数组来实现我的目标: 但是,我被迫有一个固定的长度,这仍然不是我想要的。 我想了一个肮脏的解决办法: 但要解析、读取和写入它真的很难。 这样的问题有没有干净的解决方案? 顺便说一下,这不是一个XY问题

  • 主要内容:指针数组和二维数组指针的区别二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放