我正在尝试获取一个不允许直接引用的值的地址。
int main() {
int a = {1, 2, 3, 4};
int* ptr = &arr[0];
// ptr is incremented an unknown number of times
}
指针移动了未知次数后,我需要知道指针指向的值的地址。假设*ptr现在是3,我需要在不引用数组的情况下知道3的地址。有可能吗?
地址必须指向对象或函数,因此也称为对象或函数的指针。让我们把你的问题分解为前提:
你有一个int
,只有一个(而不是数组(带有额外的(错误的(初始化程序。这有点奇怪。也许你的意思是int a[] = /* ... */
。注意,没有存储3
,因为此对象中只有一个值的空间。
²/你有一个指向int
对象的指针,它被称为ptr
,它被初始化为&a[0]
,这是一个引用操作&a
和一个去引用操作([0]
(;这些操作相互抵消,所以ptr
声明实际上相当于int *ptr = a;
,这也是错误的。也许您的意思是int *ptr = &a;
,或者,假设您更正了a
的声明(根据第1点(,那么您的代码(或简写版本,没有不必要的取消引用+引用(就可以了。
我需要知道指针指向的值的地址。
如前所述,指针不指向值;它们指向对象或函数(或者什么都没有或垃圾,这两个问题都与此无关(。。。地址是指向对象或函数的指针,因此如果您有一个指针指向对象,那么您就已经有了地址。
假设*ptr现在是3,我需要知道3的地址,而不需要引用数组。
您已经有了地址,您正在取消引用它(*ptr
(以获得值;ptr
正在存储地址,对吗?这就是为什么Jonathan Leffler评论将这个问题描述为同义词;您为获得值而取消引用的指针(根据定义(也是您打算存储3的对象的address。
你的困惑是常见的,(在你一定会问的其他常见困惑中(最好用一本像样的教科书来纠正,比如K&R2e(当你偶然发现它们时做练习(。或者,实际上有数百个常见问题;你可以阅读220多页,它会比问所有这些问题并相信所有答案更快、更可靠。。。