我有一个项目,我必须在C中创建一个基本数据库。我的问题在于不断地将变量n
从函数传递给函数,并且在某一点上值会发生变化。
我制作了一个测试程序,说明了我遇到的同样问题:
#include <stdio.h>
#include <stdlib.h>
void functionTWO(int *n)
{
printf("\n%d",*n);
}
functionONE(int *n)
{
int i=0;
i++;
i++;
*n = i;
printf("\n%d", *n);
functionTWO(&n);
}
int main()
{
int n=0;
printf("%d",n);
functionONE(&n);
return 0;
}
第二个函数中的n
显示为非常高的数字,例如:
0
2
2752268
现在,我知道这可能是有意的,但你们能否解释为什么会这样发生?
答案 0 :(得分:3)
在functionONE()
中,n
已经是指针。如果您打算更改该地址的值,则不需要传递指针的地址。
作为建议,请始终检查数据类型并启用编译器警告以帮助您。
答案 1 :(得分:2)
<强> functionONE()强> 你传递的是地址。所以这是n的打印地址。
现在你想要一个正确的输出然后n作为双指针** n。
void functionTWO(int **n)
{
printf("\n%d",**n);
}
答案 2 :(得分:1)
首先,在C int & n
中不是n的引用,它是它的地址。现在,你所做的是创建一个int - 将它的地址发送到functionONE - 做了一些值该地址然后将参数的地址发送到functionTWO,而不是发送参数本身,因为它已经是一个指针。这样做:
#include <stdio.h>
#include <stdlib.h>
void functionTWO(int *n)
{
printf("\n%d",*n);
}
functionONE(int *n)
{
int i=0;
i++;
i++;
*n = i;
printf("\n%d", *n);
functionTWO(n); // <-- send the pointer, not it's address
}
int main()
{
int n=0;
printf("%d",n);
functionONE(&n);
return 0;
}
答案 3 :(得分:0)
在functionONE
中,n
为int *
,只是一个指针,当您执行functionTWO(&n);
时,您获得n
的地址,因此输出很有价值。
答案 4 :(得分:0)
CGRect labelframe // Customize according to your need
oponent = [[UILabel alloc] initWithFrame:labelframe]; // missing
proponent = [[UILabel alloc] initWithFrame:labelframe]; // missing
函数中打印的值是functionTWO
中声明的指针变量n
的地址。在这种情况下,您可以像这样修改functionONE
functionTWO
或
只需传递指针变量的值,就像这样
void functionTWO(int **n)
{
printf("\n%d",**n);
}