将指针传递给C中的函数

时间:2016-05-06 06:35:41

标签: c pointers

我编写了一个程序,其中一个函数将两个指针作为参数,并且该函数会更改指针的地址,所以当我在main函数中调用指针的值时,它会显示相同的旧值。

代码: -

#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)调用了这些函数,但这也无法正常工作。

我甚至尝试定义这样的函数: -

 void sample(int *d,int *m){
    int month = 1;
    int day = 30;
    *m = month;
    *d = day;
 }

但程序崩溃了。

4 个答案:

答案 0 :(得分:1)

如果要将任何变量传递给函数,在此函数中更改它并返回其 new 值,则需要传递对它的引用({{ 3}}),而不是变量本身()。

特别是在您的情况下,如果您要更改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);

答案 1 :(得分:0)

sample() API中,您为指针分配了一些新值,这些值仅在示例API中有效,传递指针的目的是保留值需要更改的位置。因此,您不应该更改指针所指向的位置,只需更改位置中的值,如下所示。

void sample(int *d,int *m)
{
   int month=1,day = 30;       
   *m = month;
   *d = day;
}

答案 2 :(得分:0)

让我们看看你的功能在做什么:

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;
}

没关系;就像在,它做的事情与第一个完全不同,但至少有机会工作。它崩溃的唯一方法是传递给它的值是坏的;所以问题在于呼叫者。

答案 3 :(得分:0)

更改函数的调用解决了问题

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;
}