什么是C中的别名?

时间:2014-09-06 07:09:10

标签: c alias

如果我有:

int a= 10;

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

它说*ptr而不是ptra的别名,但ptr_2是别名[{1}}或ptr 1}}别名*ptr_2

我知道,一般来说,当两个或多个对象引用一个内存地址而不是别名时。所以在这个断言的关系中,我可以认为*ptrptr_2是别名,但我不确定,因为ptr*ptr ......的关系/ p>

那么,从C的角度来看,是什么?别名?

3 个答案:

答案 0 :(得分:1)

我正在回答这个部分“我不确定因为* ptr和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中存储的地址为{{1}因此&a的值将更改为a。希望这会有所帮助。

答案 1 :(得分:0)

您可以在Pointer aliasing上推荐此维基以获得更好的解释

  

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

     

例如,如果一个函数采用两个指针A和B,它们具有   相同的值,则名称A [0]别名为B [0]。在这种情况下我们   说指针A和B互为别名。注意这个概念   指针别名定义不明确 - 两个指针A和B可以   或者可能不会互为别名,具体取决于操作   使用A和B在函数中执行。例如,在memcpy(A +   8,A,8),其中A是指向char类型的指针,目的地和   源指针不是别名,但在memmove(A + 8,A,9)中它们可以。

答案 2 :(得分:-1)

别名意味着共享相同的内存位置 int x = 50; INT和放大器; y = x;

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