理解函数中的指针(引用值)
understanding pointers in functions (referring values)
int func (int a, int b, int *c);
int main()
{
int res, x, y, z; //int res, x, y, *z;
printf("enter x \n");
scanf("%i", &x);
printf("enter y \n");
scanf("%i", &y);
res = func(x, y, &z); //res = func(x, y, z);
printf("result addition: %i, result multiplication %i \n", res, *z);
return 0;
}
int func (int a, int b, int *c)
{
int result;
result = a +b;
*c = a*b; //(1) alternative:d=a*b
// c=&d
return result;
}
我的问题是,我不明白为什么当我按照我在评论 (//) 中所做的那样编写代码时,它不起作用。编译器警告我,z 未初始化,但为什么这在工作版本中不是问题?
我不明白的另一件事是,为什么像我在 (1) 中那样引用指针值是正确的,但在以下代码中是错误的:
int main()
{
int a, *c, *d;
scanf("%i", &a);
*c=a; //wrong
d=&a; //correct
return 0;
}
编译器警告我,z 未初始化,但为什么这在工作版本中不是问题?
编译器警告您 z 未初始化,因为您按值传递它。你传递的是一个未初始化的值(基本上是垃圾)。
当您传递 z 的地址时它不会警告您,因为将变量的地址传递给指针没有任何问题。编译器不会检查您是否要取消引用 c 并使用 z 的未初始化值。编译器不是 "smart"。它假设您会做正确的事情,并通过取消引用 c 为 z 分配一个值(您确实这样做了)。
为什么像我在 (1) 中那样引用指针值是正确的,但在下面的代码中是错误的
关于你的第二个问题,第一个例子是有效的,因为函数的参数被初始化为你调用函数时使用的任何值。
第二个示例不起作用,因为您使用的是未初始化的局部变量。
在变量被声明的地方,它存在于一些内存位置,可以用 &
检索,而(如果你不初始化它) 内容 该位置未初始化。当 z
是 int
时,&z
是一个明确定义的指针,因为它是变量的地址,而不是变量的内容。当 z
是一个 int *
时,z
的内容本身就是一个指针,但它没有被初始化;因此警告(并且很可能,当 scanf()
尝试写入任意内存位置时,您的程序将崩溃)。
你的问题表明你对指针一无所知,我建议你先阅读它们,
一个指针指向一个变量,当你这样做时
*c = a
您正在尝试使用间接运算符“*”为 c 指向的变量赋值,
问题是 c 没有指向代码中的任何内容。
在第二个
d = &a;
你让指针d指向a。换句话说,您将 a 的地址分配给 d。你真的应该先阅读指针,否则,无论我们在这里说什么对你来说都没有意义。
int func (int a, int b, int *c);
int main()
{
int res, x, y, z; //int res, x, y, *z;
printf("enter x \n");
scanf("%i", &x);
printf("enter y \n");
scanf("%i", &y);
res = func(x, y, &z); //res = func(x, y, z);
printf("result addition: %i, result multiplication %i \n", res, *z);
return 0;
}
int func (int a, int b, int *c)
{
int result;
result = a +b;
*c = a*b; //(1) alternative:d=a*b
// c=&d
return result;
}
我的问题是,我不明白为什么当我按照我在评论 (//) 中所做的那样编写代码时,它不起作用。编译器警告我,z 未初始化,但为什么这在工作版本中不是问题?
我不明白的另一件事是,为什么像我在 (1) 中那样引用指针值是正确的,但在以下代码中是错误的:
int main()
{
int a, *c, *d;
scanf("%i", &a);
*c=a; //wrong
d=&a; //correct
return 0;
}
编译器警告我,z 未初始化,但为什么这在工作版本中不是问题?
编译器警告您 z 未初始化,因为您按值传递它。你传递的是一个未初始化的值(基本上是垃圾)。 当您传递 z 的地址时它不会警告您,因为将变量的地址传递给指针没有任何问题。编译器不会检查您是否要取消引用 c 并使用 z 的未初始化值。编译器不是 "smart"。它假设您会做正确的事情,并通过取消引用 c 为 z 分配一个值(您确实这样做了)。
为什么像我在 (1) 中那样引用指针值是正确的,但在下面的代码中是错误的
关于你的第二个问题,第一个例子是有效的,因为函数的参数被初始化为你调用函数时使用的任何值。 第二个示例不起作用,因为您使用的是未初始化的局部变量。
在变量被声明的地方,它存在于一些内存位置,可以用 &
检索,而(如果你不初始化它) 内容 该位置未初始化。当 z
是 int
时,&z
是一个明确定义的指针,因为它是变量的地址,而不是变量的内容。当 z
是一个 int *
时,z
的内容本身就是一个指针,但它没有被初始化;因此警告(并且很可能,当 scanf()
尝试写入任意内存位置时,您的程序将崩溃)。
你的问题表明你对指针一无所知,我建议你先阅读它们,
一个指针指向一个变量,当你这样做时
*c = a
您正在尝试使用间接运算符“*”为 c 指向的变量赋值,
问题是 c 没有指向代码中的任何内容。
在第二个
d = &a;
你让指针d指向a。换句话说,您将 a 的地址分配给 d。你真的应该先阅读指针,否则,无论我们在这里说什么对你来说都没有意义。