微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数组指针,(*ptr)[] 和 *ptr[] 有什么区别

如何解决数组指针,(*ptr)[] 和 *ptr[] 有什么区别

当我试图理解这个数组的指针时遇到了一个奇怪的事情

#include <iostream>

int main() {
    using namespace std;

    short tell[3]{1,2,3};

    short (*pas)[3] = &tell;

    cout << (*pas)[2] << endl;
    cout << *pas[2] << endl;

    cout << endl;

    return 0;
}

对于两个输出,我得到了两个不同的值。

一个是正确的,是 3。

然而,对于第二个,它似乎每次都返回一个不同的随机数。

这两者有什么区别?

解决方法

你声明了一个指向整个数组的指针

short (*pas)[3] = &tell;

所以要获得指向的对象(数组),你必须像这样取消引用指针

*pas

现在这个表达式产生一个对数组 tell 的左值引用。所以你可以应用下标运算符来访问数组的元素

cout << (*pas)[2] << endl;

后缀下标运算符的优先级高于一元运算符 *

就是这个表达

*pas[2]

等价于表达式

*( pas[2] )

这意味着您正在尝试访问超出已分配数组的对象(数组),从而导致未定义的行为。

如果你有一个二维数组,例如

short tell[3][3] =
{ { 1,2,3 },{ 4,5,6 },{ 7,8,9 }
};

并初始化指针 pas 之类的

short (*pas)[3] = tell;

表达式 pass[2] 将产生数组的第三个元素,即 { 7,9 } 在这种情况下,您可以再应用一个下标运算符来访问数组的元素,例如

pass[2][2]

包含值 9

上面的表达式也可以不用下标运算符如

*( *( pass + 2 ) + 2 )
,

一个简单的例子可以是:

int *ptr[10];

这是一个由 10 个 int* 指针组成的数组,不是你想象的那样,是一个指向 10 个整数数组的指针

int (*ptr)[10];

这是一个指向 10 个 int 数组的指针

我认为与 int *ptr; 相同,两者都可以指向一个数组,但给定的形式只能指向一个 10 个整数的数组

您也可以查看 this 示例。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。