C 为什么可以';我们不能将解引用指针传递给指针吗?
我只是在尝试不同的传球方式,我遇到了这个疑问 我们可以使用解引用将指针值存储到指针,即(*p=*q)为什么不可以通过函数传递呢C 为什么可以';我们不能将解引用指针传递给指针吗?,c,C,我只是在尝试不同的传球方式,我遇到了这个疑问 我们可以使用解引用将指针值存储到指针,即(*p=*q)为什么不可以通过函数传递呢 void swap(int *p,int *q) { int temp=*p; *p=*q; /** when this is possible**/ *q=temp; } int main() { int a=5,b=10; int *x,*y; x=&a; y=&b; swap(&a,&b); swap(x,y);
void swap(int *p,int *q)
{
int temp=*p;
*p=*q; /** when this is possible**/
*q=temp;
}
int main()
{
int a=5,b=10;
int *x,*y;
x=&a;
y=&b;
swap(&a,&b);
swap(x,y);
swap(*x,*y);/*why this is not possibel*/
}
*p=*q when this is possible.
一,<代码>交换(&a和&b)代码>这是可能的
2. <代码>交换(*x,*y)代码>这是不可能的。为什么?
任何人都可以在指针上深入发布好的材料。请参见,
&a
在您的情况下相当于x
为什么要*x
?传递x
与传递&a
相似吗
*x
的数据类型为int
,x
的数据类型为int*
。函数期望传递的参数类型为int*
也许值得一提[在代码的上下文中]
void func(int p,int q)
应称为func(a,b)
这并不意味着,void func(int*p,int*q)
应称为func(*a,*b)
,而应称为func(&a,&b)代码>
只需使用交换(x,y)
作为旁注:C
使用传递值方法。如果将值作为函数参数传递,则在函数内部,它将在函数的局部范围内的变量中接收,对它们所做的任何更改都不会反映在实际参数中
这就是为什么,您需要传递变量的地址,而不是值本身。请参见,&a
在您的情况下相当于x
为什么要*x
?传递x
与传递&a
相似吗
*x
的数据类型为int
,x
的数据类型为int*
。函数期望传递的参数类型为int*
也许值得一提[在代码的上下文中]
void func(int p,int q)
应称为func(a,b)
这并不意味着,void func(int*p,int*q)
应称为func(*a,*b)
,而应称为func(&a,&b)代码>
只需使用交换(x,y)
作为旁注:C
使用传递值方法。如果将值作为函数参数传递,则在函数内部,它将在函数的局部范围内的变量中接收,对它们所做的任何更改都不会反映在实际参数中
这就是为什么,您需要传递变量的地址,而不是值本身。第二个是不可能的,因为在这种情况下,您将使用按值传递而不是指针,因此,调用函数中的值将被更改,但是,没有反映在main方法中,因为它们是该方法的本地对象,并且您没有使用指针
实现该解决方案的另一个可能的解决方案是,为此,您需要更改main中的函数调用。
函数调用将更改为
swap(x,y); //don't use dereferenced pointers here as it will result in call by value.
void swap(int *p,int *q)
{
int temp=*p;
*p=*q; (** when this is possible**)
*q=temp;
}
这就完成了。第二个是不可能的,因为在这种情况下,您将使用传递值而不是指针,因此,被调用函数中的值将被更改,但不会反映在主方法中,因为它们是该方法的本地值,并且您没有使用指针
实现该解决方案的另一个可能的解决方案是,为此,您需要更改main中的函数调用。
函数调用将更改为
swap(x,y); //don't use dereferenced pointers here as it will result in call by value.
void swap(int *p,int *q)
{
int temp=*p;
*p=*q; (** when this is possible**)
*q=temp;
}
这就完成了。在int*x、*y之后
类型*x
和*y
为int
。swap
函数需要两个int*
作为参数,而不是两个int
在int*x,*y之后
类型*x
和*y
为int
。您的swap
函数需要两个int*
作为参数,而不是两个int
您的第二个示例应该是
swap(x,y);
已经是x=&a
和y=&b
如果您想交换指针(而不是其内容),则需要以下内容:
void swapptr(int **p,int **q)
{
int temp=*p;
*p=*q;
*q=temp;
}
请注意函数参数的不同定义
如果要进行常规交换,则需要传递类型的宏,如下所示:
#define SWAP(a, b, type) do { type _temp = a; a = b; b = _temp; } while (0)
#define SWAP(a, b) do { typeof(a) _temp = a; a = b; b = _temp; } while (0)
或者使用gcc扩展,如下所示:
#define SWAP(a, b, type) do { type _temp = a; a = b; b = _temp; } while (0)
#define SWAP(a, b) do { typeof(a) _temp = a; a = b; b = _temp; } while (0)
你的第二个例子应该是
swap(x,y);
已经是x=&a
和y=&b
如果您想交换指针(而不是其内容),则需要以下内容:
void swapptr(int **p,int **q)
{
int temp=*p;
*p=*q;
*q=temp;
}
请注意函数参数的不同定义
如果要进行常规交换,则需要传递类型的宏,如下所示:
#define SWAP(a, b, type) do { type _temp = a; a = b; b = _temp; } while (0)
#define SWAP(a, b) do { typeof(a) _temp = a; a = b; b = _temp; } while (0)
或者使用gcc扩展,如下所示:
#define SWAP(a, b, type) do { type _temp = a; a = b; b = _temp; } while (0)
#define SWAP(a, b) do { typeof(a) _temp = a; a = b; b = _temp; } while (0)
*x
和*y
的类型是什么?您的函数需要什么类型?函数需要地址??为什么它不能复制x和y的值。*x
和*y
的值是int
。函数需要int*
,它是x
或&a
。请查看下面的答案以获得澄清。*x
和*y
的类型是什么?您的函数需要什么类型?函数需要地址??为什么它不能复制x和y的值。*x
和*y
的值是int
。函数需要int*
,它是x
或&a
。检查下面的ansers以获得澄清。这不会交换任何东西,因为交换的变量在退出函数时丢失。这不会交换任何东西,因为交换的变量在退出函数时丢失。我不期望输出…当我们调用带有参数的函数时,它会复制变量,为什么第二个函数期望输出地址???@goutham请检查这种情况下的数据类型<代码>&a
是int*
,而*x
是