在C语言中,“alias”是什么意思?

3
如果我有:
int a= 10;

int *ptr = &a;
int *ptr_2 = ptr;

据说*ptr而不是ptra的别名,但是ptr_2ptr的别名还是*ptr_2*ptr的别名?
我知道一般来说当两个或多个对象引用一个内存地址时就被称为别名。因此,在这种情况下,我认为ptr_2ptr是别名,但我不确定*ptra之间的关系...
那么从C语言角度来看,什么是别名?
3个回答

1

我正在回答"I'm not sure because the relationship of *ptr and a"部分,我认为其余部分已经很清楚了。

在C语言中,每个变量都有一个值和一个地址。后者指定变量在内存中的位置,并且对于程序是唯一的。int a声明一个具有某个地址(如&a)的变量。现在,当您将10赋给a时,值10被放置在地址&a处。

当您声明int *ptr = &a时,将声明一个新变量ptr,其地址为&ptr,值为&a。 现在,由于ptr的类型是int*,因此可以通过使用*ptr直接访问存储在变量ptr中的地址。这称为dereferencing

基本上,当您在程序中写入*ptr时,它意味着存储在ptr中的地址的值,这种情况下是10。如果您稍后进行赋值*ptr = 20,则存储在ptr中的地址的值将更改为20。在这种情况下,存储在ptr中的地址是&a,因此a的值将更改为20。希望这可以帮到您。

0

您可以参考指针别名的维基百科,以获得良好的解释。

别名是指同一内存位置可以使用不同的名称访问的情况。

例如,如果一个函数接受两个指针A和B,它们具有相同的值,则名称A[0]与名称B[0]别名。在这种情况下,我们说指针A和B彼此别名。请注意,指针别名的概念并不是非常明确的 - 两个指针A和B可能会或可能不会彼此别名,这取决于在使用A和B的函数中执行了哪些操作。例如,在memcpy(A + 8,A,8)中,其中A是指向char类型的指针,目标和源指针不别名,但在memmove(A + 8,A,9)中,它们别名。


这个维基也是自相矛盾的:它说A和B彼此别名,但同时也说A [0],即A,和B [0],即B,是别名... - xdevel2000
3
维基百科称,“别名(aliasing)是指可以使用不同的名称访问相同内存位置的情况。”由于A和B具有相同的值,所以“A”和“B”指向相同的地址空间,即相同的内存位置。 - Nishant
@Nishant,看起来A和B是别名,因为它们的值是相同的地址;同时A和B也是别名,因为它们解引用了相同的地址... - xdevel2000

-2

别名意味着共享同一内存位置。 int x = 50; int& y = x;

现在x和y共享同一内存位置。*ptr是指针变量,指向其他变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接