繁体   English   中英

将指针传递给C函数

[英]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;
 }

但是程序崩溃了。

当您要将任何变量传递给函数时,在此函数中对其进行更改并返回其值,则需要传递对其的引用( ),而不是变量本身( )。

具体而言,如果要更改dm的地址,则需要将引用传递要更改的地址 这意味着应该像这样修改您的函数:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM