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

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

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++相关问答推荐

我应该如何解决我自己为iOS编译的xmlsec1库的问题?转换Ctx.first在xmlSecTransformCtxPrepare()之后为空

__VA_OPT__(,)是否可以检测后面没有任何内容的尾随逗号?

为什么cudaFree不需要数据 struct 的地址?

平均程序编译,但结果不好

S将C语言宏定义为自身的目的是什么?(在glibc标题中看到)

这个计算C中阶乘的函数正确吗?

C I/O:在Windows控制台上处理键盘输入

在C++中父进程和子进程中的TAILQ队列同步问题

如何用C语言为CLI应用程序编写按键检测系统?

错误...的多个定义(&Q)首先在这里定义&

pthread_create的用法

为四维数组中的Dim-1和Dim-3重新分配空间

try 查找带有指针的数组的最小值和最大值

我编写这段代码是为了判断一个数字是质数、阿姆斯特朗还是完全数,但由于某种原因,当我使用大数时,它不会打印出来

如何编写postgresql支持函数

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同

传递参数:C 和 C++ 中 array 与 *&array 和 &array[0] 的区别

通过修改c中的合并排序对数组的偶数索引进行排序

如何修复数组数据与列标题未对齐的问题?

假设函数调用返回的 string(char *) 上有 free() 是否安全?