Subscripting/Indexing C++ 中的指针
Subscripting/Indexing a Pointer in C++
我正在研究我正在学习的 class 的一些代码,由于我不熟悉 C++,我对下标指针感到困惑。
我的假设:
&
以变量名为前缀,为您提供指向该值的内存地址的指针,与以变量名为前缀的 *
大致相反,后者又为您提供值驻留在特定内存地址。
指针是可下标的,因此 ptr[0] == ptr
和 ptr[n] == ptr + (n * data_bytes)
,其中 data_bytes
取决于指针的特定类型(例如,32 位整数为 4 字节宽)。
问题:
内存地址下标时,必须先放到一个变量中,不明白为什么不能直接给变量下标
最小代码示例:
#include <iostream>
using namespace std;
int main() {
int val = 1;
int *val_ptr = &val;
cout << &val << endl;
// works
cout << val_ptr[0] << endl;
// does not work
// cout << &val[0] << endl;
return 0;
}
附录
我知道一些相关问题,但它们并没有真正帮助我理解这个具体问题。
我看过:
- What are the differences between a pointer variable and a reference variable in C++?
- how does the ampersand(&) sign work in c++?
- subscript operator on pointers
- Subscripting integer variable using a pointer
虽然这几乎肯定是重复的(我不会是第一个被指针混淆的人),或者甚至可能有一个我在链接问题中忽略的答案,但我会很感激任何帮助!
根据 Ted Klein Bergmann 的评论,运算符优先级存在问题。
[]
is considered before &
. Do (&val)[0]
instead.
所以一个可行的例子是
#include <iostream>
using namespace std;
int main() {
int val = 1;
// does work now
cout << (&val)[0] << endl;
return 0;
}
我正在研究我正在学习的 class 的一些代码,由于我不熟悉 C++,我对下标指针感到困惑。
我的假设:
&
以变量名为前缀,为您提供指向该值的内存地址的指针,与以变量名为前缀的 *
大致相反,后者又为您提供值驻留在特定内存地址。
指针是可下标的,因此 ptr[0] == ptr
和 ptr[n] == ptr + (n * data_bytes)
,其中 data_bytes
取决于指针的特定类型(例如,32 位整数为 4 字节宽)。
问题:
内存地址下标时,必须先放到一个变量中,不明白为什么不能直接给变量下标
最小代码示例:
#include <iostream>
using namespace std;
int main() {
int val = 1;
int *val_ptr = &val;
cout << &val << endl;
// works
cout << val_ptr[0] << endl;
// does not work
// cout << &val[0] << endl;
return 0;
}
附录
我知道一些相关问题,但它们并没有真正帮助我理解这个具体问题。
我看过:
- What are the differences between a pointer variable and a reference variable in C++?
- how does the ampersand(&) sign work in c++?
- subscript operator on pointers
- Subscripting integer variable using a pointer
虽然这几乎肯定是重复的(我不会是第一个被指针混淆的人),或者甚至可能有一个我在链接问题中忽略的答案,但我会很感激任何帮助!
根据 Ted Klein Bergmann 的评论,运算符优先级存在问题。
[]
is considered before&
. Do(&val)[0]
instead.
所以一个可行的例子是
#include <iostream>
using namespace std;
int main() {
int val = 1;
// does work now
cout << (&val)[0] << endl;
return 0;
}