[英]Passing pointers to function in C
我编写了一个程序,其中一个函数将两个指针作为参数,并且该函数更改了指针的地址,因此,当我在主函数中调用指针的值时,它将显示相同的旧值。
码:-
#include <stdio.h>
void sample(int *d, int *m);
int main(){
int day=12,month=3;
int *d,*m;
d = &day;
m = &month;
printf("Day = %d \t MOnth = %d\n",*d,*m);
sample(d,m);
printf("Day = %d \t Month = %d\n",*d,*m);
}
void sample(int *d, int *m){
int month = 1;
int day = 30;
m = &month;
d = &day;
}
基于对stackoverflow的同一问题的回答,我什至使用sample(&d,&m)
调用了函数sample(&d,&m)
但这也没有用。
我什至尝试定义如下功能:-
void sample(int *d,int *m){
int month = 1;
int day = 30;
*m = month;
*d = day;
}
但是程序崩溃了。
当您要将任何变量传递给函数时,在此函数中对其进行更改并返回其新值,则需要传递对其的引用( passing-by-reference ),而不是变量本身( passing-by-value )。
具体而言,如果要更改d
和m
的地址,则需要将引用传递给要更改的地址 。 这意味着应该像这样修改您的函数:
void sample(int *d,int *m){
*m = 1;
*d = 30;
}
并相应地修改您的main
功能的主体,如下所示:
int day=12, month=3;
sample(&day, &month);
但是,如果您坚持自己的方式,则应进行以下修改:
void sample(int **d, int **m){
int month = 1;
int day = 30;
*m = &month;
*d = &day;
}
因此,您应该像这样更改函数的调用:
int day=12, month=3;
int *d, *m;
d = &day;
m = &month;
sample(d,m);
在sample()
API中,您正在为指针分配一些新值,并且这些值仅在示例API中有效,您传递指针的目的是保留需要更改值的位置,因此您不应更改指针指向的位置,只需更改位置中的值,如下所示。
void sample(int *d,int *m)
{
int month=1,day = 30;
*m = month;
*d = day;
}
让我们看看您的函数在做什么:
void sample(int *d,int *m){ // take a temporary pointer arg
int month = 1; // create a temporary variable
m = &month; // assign the address of the temporary
// to the temporary pointer
}
一个函数将两个指针作为争论,并且该函数更改了指针的地址
如果您真的想要,那么:
您添加的示例:
void sample(int *d,int *m) {
int month = 1;
int day = 30;
*m = month;
*d = day;
}
还可以 例如,它所做的事情与第一个完全不同,但是至少有工作的机会。 崩溃的唯一方法是传递给它的值是否错误;否则,它会崩溃。 所以问题出在调用者上。
更改函数的调用解决了问题
sample(&day,&month);
新代码:-
#include<stdio.h>
void sample(int *d,int *m);
int main(){
int day=12,month=3;
int *d,*m;
d = &day;
m = &month;
printf("Day = %d \t MOnth = %d\n",*d,*m);
sample(&day,&month);
printf("Day = %d \t Month = %d\n",*d,*m);
}
void sample(int *d,int *m){
int month = 1;
int day = 30;
*m = month;
*d = day;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.