如果我有:
int a= 10;
int *ptr = &a;
int *ptr_2 = ptr;
它说*ptr
而不是ptr
是a
的别名,但ptr_2
是别名[{1}}或ptr
1}}别名*ptr_2
?
我知道,一般来说,当两个或多个对象引用一个内存地址而不是别名时。所以在这个断言的关系中,我可以认为*ptr
和ptr_2
是别名,但我不确定,因为ptr
和*ptr
......的关系/ p>
那么,从C的角度来看,是什么?别名?
答案 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是指针变量并指向其他变量。