Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C是否总是必须使用指针来处理地址?_C_Pointers_Memory Address - Fatal编程技术网

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

C是否总是必须使用指针来处理地址?,c,pointers,memory-address,C,Pointers,Memory Address,据我所知,C必须处理地址的所有情况都涉及使用指针。例如,&操作数创建一个指向程序的指针,而不是只给出裸地址作为数据(即,如果不首先使用指针,它就不会给出地址): 或者在使用操作数(&O)时 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必须处理地址的所有情况都涉及使用指针。例如,&操作数创建一个指向程序的指针,而不是只给出裸地址作为数据(即,如果不首先使用指针,它就不会给出地址):

或者在使用操作数(&O)时

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 Postdischil、MichałMarszałek、user3386109、Mike Holt和Gecko的评论中得到了回答;我将在这里对这些位进行分组:是的,由于不同的因素,使用裸地址几乎没有用处(指针允许许多操作,每次运行程序时,地址可能会改变,等等)。正如MichałMarszałek指出的(并非双关语),scanf()使用指针,因为C只能处理副本,所以需要使用指针来更改所使用的变量。i、 e

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

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

C允许您将指针转换为整数。
标题提供了一个
uintpttr\u t
类型,其属性是指向
void
的任何指针都可以转换为
uintpttr\u t
并返回,结果将与原始指针进行相等的比较

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

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

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

在少数域之外,“裸地址”值本身根本没有用处。我们对地址的兴趣不如对地址上的对象的兴趣。C要求我们在两种情况下使用指针:

  • 当我们希望函数写入参数时
  • 当我们需要跟踪动态分配的内存时
在这些情况下,我们并不真正关心地址值实际上是什么;我们只需要它来访问我们感兴趣的对象


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

指针是C表示地址的方式,所以,是的,你总是必须使用指针来处理地址。我认为没有“裸地址”这样的东西。例如,在您的示例中,
foo
可能是一个整数值,而不是整数值的“裸地址”。
&
运算符将该整数的地址作为指针生成。(C语言中有一个
void*
,但它只是一个去掉类型信息的指针——尽可能避免使用它,它很容易用错,因为编译器无法帮助您检测错误)地址是一个数值,只要地址与值匹配,就可以使用unsigned int来保存地址。这里的点是用来表示间接寻址的,因此编译器可以在数据和地址之间进行区分我没有看到您所做的区分-“只是地址”是什么样子的?“地址”与指针有何不同?@Chabon对象的地址不会因“内存管理”而改变。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