C总是必须使用指针来处理地址吗



据我所知,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 322; 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在它的答案中涵盖了大部分这些主题,所以我会标记这一个。

指针地址(或者,更确切地说,它是地址的抽象)。指针是我们在C.中处理地址值的方式

除了一些域之外,"裸地址"值本身根本没有用处。我们对地址的兴趣不如对该地址的对象的兴趣。C要求我们在两种情况下使用指针:

  • 当我们希望函数写入参数时
  • 当我们需要跟踪动态分配的内存时

在这些情况下,我们并不真正关心地址值的实际值;我们只需要它来访问我们感兴趣的对象。

是的,在嵌入式世界中,特定地址值是有意义的。但是您仍然使用指针来访问这些位置。正如我上面所说,指针用于我们目的的地址。

C允许您将指针转换为整数。<stdint.h>标头为uintptr_t类型提供了一个属性,即指向void的任何指针都可以转换为uintptr_t并返回,结果将与原始指针进行比较。

根据C 2018 6.3.2.3 6,将指针转换为整数的结果由实现定义。非规范性注释69说:"将指针转换为整数或将整数转换为指针的映射函数旨在与执行环境的寻址结构一致。">

因此,在地址是简单编号方案的机器上,即使标准不要求,将指针转换为uintptr_t也应该为您提供自然的机器地址。然而,在某些环境中,地址更复杂,将指针转化为整数的结果可能并不简单。

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

最新更新