我试图弄清楚指针在函数中是如何工作的.

我知道指针可以用作函数参数,如下所示

int *max(int* a, int* b){
    if (*a > *b)
      return a;
    else
      return b;
}

int *p, i, j;
p = max(&i, &j);

我对此的理解是,我有一个函数,它返回一个int指针,它的参数是2个int指针.当该函数被调用时,它被提供给两个int类型的地址,i和j,参数中的指针被分别赋值给它们.最后,返回大整型.这样对吗?在我看来,这是有道理的.

我对将指针传递给函数时所发生的事情感到困惑.

所以,像这样的东西

int *p, i, j;
int *k = &i
p = max(k, &j);

在这种情况下,是不是制作了指针的副本?此外,这将如何与对象一起工作?是复制指针指向的整个对象,还是只复制指针?

推荐答案

它本质上是赋值(不是赋值操作a = b,但行为相同).

当您将参数传递给函数时,实质上是从参数到函数参数进行赋值.

#include <stdio.h>

int foo(int *param)
{
    return *param + 1;
}

int main(void)
{
    int var = 0;
    int *pointer = &var;
    
    printf("This will print 1: %d\n", foo(&var));
    printf("This will also print 1: %d\n", foo(pointer));
}

当您进行第一个调用时,它的工作方式就像您在进行param = &var赋值一样,这完全没有问题,因为您正在使函数foo中的变量param接收地址var.

当您进行第二个调用时,它的工作方式就像您在进行param = pointer赋值一样,这也是完全没有问题的,因为您正在使函数foo中的变量param接收值pointer,这也是var的地址.

看待指针的最好方法就是把它们想象成像intchar之类的变量.指针并没有那么特别,它们只是保存值的变量.但它不是一个整数或浮点数,而是一个内存地址.

C++相关问答推荐

InetPton()函数无效的IP地址

从组播组地址了解收到的数据包长度

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

正在try 将文件/文件夹名从目录 struct 存储到链接列表

测量ARM MCU中断延迟的问题

字符是否必须转换为无符号字符,然后才能与getc家族的返回值进行比较?

在我的代码中,我需要在哪里编写输出函数?

指向不同类型的指针是否与公共初始序列规则匹配?

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

我可以创建适用于不同endian的 colored颜色 struct 吗?

在下面的C程序中,.Ap0是如何解释的?

Linux/C:带有子进程的进程在添加waitid后都挂起

C中的数组下标和指针算法给出了不同的结果

从Raku nativecall调用时精度不同

C程序printf在getchar while循环后不工作

无法理解 fgets 输出

中位数和众数不正确

使用替代日历打印日期

为什么 C 字符串并不总是等同于字符数组?

C99 的 %zu 格式说明符不起作用