据我了解,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的评论中得到回答;我在这里将这些位分组:是的,由于不同的因素(使用指针可以进行多种操作,每次运行程序时地址都会改变,等等),使用裸地址几乎没有用。正如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)在答案中涵盖了大部分主题,因此我将其标记为一个主题。
答案 0 :(得分:1)
int i; //a variable
int *p; //a variable that store adres
i = 10; //now i is set to 10
p = &i; //now p is set to i address
*p = 20; //we set to 20 the given address
int tab[10]; // a table
p = tab; //set address
p++; //operate on address and move it to next element tab[1]
我们可以通过指针向前或向后移动来对地址进行操作。我们可以设置并读取给定地址。
在C语言中,如果要从函数中获取返回值,则必须使用指针。或者使用函数的返回值,但是那样一来我们只能获得一个值。
在C语言中,我们没有引用,因此必须使用指针。
void fun(int j){
j = 10;
}
void fun2(int *j){
*j = 10;
}
int i;
i = 5; // now I is set to 5
fun(i);
//printf i will print 5
fun2(&i);
//printf I will print 10
答案 1 :(得分:1)
C允许您将指针转换为整数。 <stdint.h>
标头提供了一种uintptr_t
类型的属性,该属性可以将指向void
的任何指针转换为uintptr_t
并返回,结果将与原始指针进行比较。
根据C 2018 6.3.2.3 6,将指针转换为整数的结果是实现定义的。非规范性注释69说:“用于将指针转换为整数或将整数转换为指针的映射功能旨在与执行环境的寻址结构一致。”
因此,在地址是简单编号方案的机器上,将指针转换为uintptr_t
应,以为您提供自然的机器地址,即使标准不需要它。但是,在某些环境中,地址更加复杂,将指针转换为整数的结果可能并不直接。
答案 2 :(得分:1)
指针是地址(或更确切地说,是地址的抽象)。指针是我们如何处理C语言中的地址值。
在少数几个域中,“裸地址”值本身根本就没有用。我们对地址的兴趣比对对象的兴趣要小。 C 要求我们在两种情况下使用指针:
在这种情况下,我们实际上并不关心地址的实际值;我们只需要它即可访问我们感兴趣的对象。
是的,在嵌入式世界中,特定的地址值是有意义的。但是您仍然使用指针访问那些位置。就像我在上面说的那样,指针是用于我们目的的地址。