Cal*_*Jay 7 c pointers dereference address-operator
我试图更好地理解指针和C语言中的引用,我的课程提供了以下程序作为示例.
#include <stdio.h>
void swap(int* a, int* b);
int main(void)
{
int x = 1;
int y = 2;
swap(&x, &y);
printf("x is %i\n", x);
printf("y is %i\n", y);
}
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
Run Code Online (Sandbox Code Playgroud)
我将以下内容混为一谈,看看它是否能帮助我更好地了解正在发生的事情,主要是关于使用&与*(取消引用)的需要.基本上,声明指向int类型(int*a)的指针与使用星号指向"取消引用"(*a =*b)的语法对我来说非常混乱,我希望有人可以启发我.以下是我认为有助于澄清的上述另一个版本,但实际上并非如此:
#include <stdio.h>
void swap(int* a, int* b);
int main(void)
{
int x = 1;
int y = 2;
int *a = &x;
int *b = &y;
swap(a, b);
printf("x is %i\n", x);
printf("y is %i\n", y);
}
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
Run Code Online (Sandbox Code Playgroud)
简而言之,我的问题是,这两个程序在做什么之间存在功能差异?dereference(*a = *b)与使用&operator(*a = &x)之间的区别是什么?
你混淆了声明和作业.
*a = *b被称为任务.请注意,它不包含类型名称.
int *a = &x另一方面被称为宣言.请注意,您初始化的指针与x的地址.您没有取消引用指针,但将其声明为指向int的指针.
看这个:
int main() {
int a = 5;
int b = 2;
int *c = &a; // c when dereferenced equals 5; **Declaration**
int *d = &b; // d when dereferenced equals 2; **Declaration**
int tmp = *c; // tmp equals 5
*c = *d; // c when dereferenced now equals 2 **Assignment**
*d = tmp; // d when dereferenced now equals 5 **Assignment**
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最后,当你声明并初始化一个指针在同一个语句,您指定的指针的地址,你要它有什么样点.如果要更改对象指向的值,请使用取消引用它*.在另一方面,如果你想改变什么它指向的,你不取消对它的引用.
小智 5
&x返回 x 的地址。x 是整数类型并且a是指向整数的指针类型。在这种情况下,(*a = &x),您将 x 的地址分配给“指向整数的指针”类型的变量,即a. (*a = *b) 是两个相同类型的整数变量之间的赋值操作。我说整数是因为即使a和b是“指向整数的指针”,在该操作中它们被取消引用,因此读取它们指向的整数值。
我认为您的困惑是因为 (*a = &x) 仅在指针初始化期间才有意义。