【发布时间】:2019-02-12 23:08:37
【问题描述】:
据我了解,C 必须处理地址的所有情况都涉及使用指针。例如,& 操作数创建了一个指向程序的指针,而不是仅仅给出裸地址作为数据(即它在不先使用指针的情况下永远不会给出地址):
scanf("%d", &foo)
或者当使用 & 操作数时
int i; //a variable
int *p; //a variable that store adress
p = &i; //The & operator returns a pointer to its operand, and equals p to that pointer.
我的问题是:C 程序总是必须使用指针来管理地址有什么原因吗?是否存在 C 可以自己或使用其他方法处理裸地址(地址的数值)的情况?或者这完全不可能? (由于系统架构,内存分配在每个运行时期间和期间发生变化等)。最后,如果地址因内存管理而改变,那会有用吗?如果是这样的话,这就是为什么总是需要指针的原因。
我试图弄清楚在 C 标准化语言中是否必须使用使用指针。不是因为我想使用其他东西,而是因为我想确定使用地址的唯一方法是使用指针,而忘记其他一切。
编辑:由于部分问题已在 Eric Postpischil、Michał Marszałek、user3386109、Mike Holt 和 Gecko 的 cmets 中得到解答;我将在此处对这些位进行分组:是的,由于不同的因素,使用裸地址几乎没有用处(指针允许许多操作,每次运行程序时地址可能会改变,等等)。正如 Michał Marszałek 所指出的(没有双关语),scanf() 使用指针,因为 C 只能处理副本,因此需要一个指针来更改所使用的变量。即
int foo;
scanf("%d", foo) //Does nothing, since value can't be changed
scanf("%d", &foo) //Now foo can be changed, since we use it's address.
最后,正如 Gecko 所说,指针是用来表示间接的,以便编译器可以区分数据和地址。
John Bode 在它的答案中涵盖了大部分这些主题,所以我会标记那个。
【问题讨论】:
-
指针是 C 表示地址的方式,所以,是的,你总是必须使用指针来处理地址。
-
我认为没有“裸地址”之类的东西。例如,在您的示例中,
foo(可能)是一个整数值,而不是整数值的“裸地址”。&运算符将该整数的地址作为指针产生。 (在 C 中有一个void *这样的东西,但这只是一个类型信息被剥离的指针——尽可能避免使用它,它很容易用错,因为编译器将无法帮助您发现错误) -
地址是一个数值,你可以使用 unsigned int 来保存一个地址,只要地址适合这个值。点在那里表示间接,以便编译器可以在数据和地址之间做出区别
-
我没有看到你所做的区分——“只是地址”会是什么样子? “只是地址”与指针有何不同?
-
@Chabon 对象的地址不会因为“内存管理”而改变。 C 没有垃圾收集器或类似的东西。对象不会像某些语言那样在内存中移动。指针只是一个整数,它保存一些其他对象的地址。它的值不会改变,除非你改变它。它们允许一些不同的语言级别操作(即下标、不同的加法语义),但在汇编级别没有区别(在大多数现代架构上)。
标签: c pointers memory-address