【发布时间】:2019-07-24 19:03:19
【问题描述】:
何时创建指向a 和b 的指针?
在下面的代码中,我只声明/启动了a 和b。
但是函数swap 用&a 和&b 来处理它们,它们是指针。
我的问题是,
指向a和b的指针是用int a和int b同时创建的吗?
或者它们是在使用参数&a 和&b 调用swap 函数时创建的?
#include <stdio.h>
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a = 3;
int b = 5;
swap(&a, &b);
printf("%d %d", a, b);
}
【问题讨论】:
-
不会创建指向变量的指针,它们只是作为语言方式的结果而存在。在实践中,它们是这些变量的地址,很可能是通过将一些编译时已知的偏移量添加到基址或堆栈指针来生成的,而地址是在运行时生成的。
-
&运算符创建指针,就像+运算符添加数字,而一元-运算符否定数字一样。因此,如果我调用f(&a, b+c, -d),&、+和-运算符都或多或少同时工作,因为函数调用的参数正在准备中。 -
@SteveSummit
&运算符创建指针? -
@CinCout:当然,就像
*运算符在4*5中创建产品20一样。在任何一种情况下,4*5或&a,结果都只是一个值(数字、字母、地址或某种事物集合中的其他元素)而不是对象(其内容可以表示的存储区域值),但该值是作为运算符的结果产生的。 -
@CinCout 或“生成”指针。无论如何,这就是我倾向于以更高层次的方式处理它的方式。现在,这是真的,取决于
a和b是什么,它们的地址就是它们的地址,并且(正如其他 cmets 指出的那样)可能没有真正的工作来“创建”它们。 (如果a具有静态持续时间,例如,f(&a)基本上只是将一个常量传递给f,尽管它是一个链接时间常量。)但是鉴于a和b是局部变量,编译器是在将它们传递给swap()之前,必须发出实际代码来将它们的偏移量添加到当前堆栈/帧指针。
标签: c pointers unary-operator