数组指针,(*ptr)[] 和 *ptr[] 有什么区别
Pointer of array, what is the difference between (*ptr)[] and *ptr[]
当我试图理解指针 tp this array 时遇到了一件奇怪的事情
#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。
然而,对于第二个,似乎returns一个每次都不同的随机数。
这两个有什么区别?
您声明了一个指向整个数组的指针
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, 8, 9 }
在这种情况下,您可以再应用一个下标运算符来访问数组的元素,例如
pass[2][2]
包含值 9
。
上面的表达式也可以不用下标运算符重写
*( *( pass + 2 ) + 2 )
一个简单的例子可以是:
int *ptr[10];
这是一个包含 10 个 int*
指针的数组,而不是像你想象的那样,是一个指向包含 10 个整数的数组的指针
int (*ptr)[10];
这是一个指向 10 int 数组的指针
我认为与int *ptr;
一样,两者都可以指向一个数组,但给定的形式只能指向一个包含 10 个整数的数组
您也可以查看 this 示例。
当我试图理解指针 tp this array 时遇到了一件奇怪的事情
#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。
然而,对于第二个,似乎returns一个每次都不同的随机数。
这两个有什么区别?
您声明了一个指向整个数组的指针
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, 8, 9 }
在这种情况下,您可以再应用一个下标运算符来访问数组的元素,例如
pass[2][2]
包含值 9
。
上面的表达式也可以不用下标运算符重写
*( *( pass + 2 ) + 2 )
一个简单的例子可以是:
int *ptr[10];
这是一个包含 10 个 int*
指针的数组,而不是像你想象的那样,是一个指向包含 10 个整数的数组的指针
int (*ptr)[10];
这是一个指向 10 int 数组的指针
我认为与int *ptr;
一样,两者都可以指向一个数组,但给定的形式只能指向一个包含 10 个整数的数组
您也可以查看 this 示例。