指针地址的含义是什么?

5
如果您有以下代码:
int b = 10;
int* a = &b;
std::cout << a << " " << &a << " ";

结果是地址不同。

但是指针的地址有什么意义呢?

指针的值是变量的地址,因为我们在内存中有一个变量。但我们没有将地址的值存储在内存中,那么为什么我们要有地址的地址呢?

也许我有些误解,感谢您的帮助。


指针的地址是你会分配给一个指向指针的指针的。 - Grady Player
3
ab 都是存储在内存中的变量。这两个变量都有各自的内存地址。 - Colonel Thirty Two
std::cout 不应该出现在一个 C 语言问题中。你是否使用的是 C++ 编译器?如果是,那么这就是一个 C++ 问题。 - autistic
“但是我们没有存储内存中地址的值” - 实际上我们有。指针可以像任何其他类型的对象一样被存储在内存中(作为命名变量 - 左值)。 - Galik
欢迎来到StackOverflow...请不要在编辑问题时更改问题的含义或发布答案;请仅将答案作为答案发布。谢谢。 - autistic
4个回答

4

记住,您机器上的地址本身将是一个32位或64位的值(取决于您的系统结构)。

在您的示例中,您有存储值为10的整数b,让我们称其为地址500

然后您有一个指针a,它存储值500,并且它有自己的地址。

重点是什么?您实际上可以有双指针(甚至更多)。

您了解到,在...

char* string = "hello";

字符串是指向字符数组开头的指针。

然后,

char** strings;

这是一个指向char*的指针。举个例子,这就可以用于数组的数组。


3
std::cout << a << " " << &a<<" ";

是的,它们是不同的。
1. “a”被分配了“b”的地址,因此它打印出“b”的地址。
2. “&a”打印指针“a”本身的地址。
而且,“a”和“b”没有相同的地址。
这类似于以下示例(以便理解):
int b=9;

如果您打印b,将会得到它的值即9,但是如果您打印&b,您将得到它的地址,并且这两者在任何情况下都不相同。
指针也是如此。指针的值是变量的地址,因为我们在内存中有一个变量。但是我们并没有存储���址值本身,那么为什么我们要存储一个地址的地址呢?
我们声明一个变量(指针,数组,只是int, char),这些都在程序中声明并存储在内存中。因为它们存储在内存中,它们有唯一的地址。

1

指针的值是变量的地址

我假设你所说的变量指的是对应于变量的对象。然而,这并不完全正确,当我们开始区分地址指针值时,就会涉及到一些边缘情况。

有一些指针值根本不指向对象。例如,考虑空指针。

按照定义,地址确实指向对象……或函数。

指针的地址是什么意思?

如果你能想象一个声明用于存储指针的变量(例如T *var;),并且你取它的地址(&var),那么指针的地址这个术语就有了意义。

那么为什么我们需要一个地址的地址呢?

地址是一种指针值,但指针值不指向值;它们指向对象或函数。&aa不同,因为这两个指针指向不同的对象;一个指向a,另一个指向b


0

谢谢大家,我知道问题出在哪里了。

实际上,我通过 int* a = &b; 在内存中创建了一个指针,但我认为我没有这样做,所以这是我的错误。

但我认为你不能输出不存在于内存中的东西的地址,比如 cout<<&(&a),编译器会告诉你 "&" 运算符需要一个左值变量。

如果你想输出指向 a 的指针的地址,你需要定义一个指向指针的变量 int **p2p=&a,然后你可以使用 cout<<&p2p,它可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接