【问题标题】:Confusion on passing in pointers to functions传递函数指针的困惑
【发布时间】:2012-08-02 15:31:57
【问题描述】:

我正在读一本书来学习 Objective-C,而这个程序应该展示处理指针的关键概念,我真的迷路了。

函数的参数中是否发生了某种转换,将 p1p2&il&i2 转换为指针的值 (*)?像p1 变成*p1

我以为是变量的副本传入函数而不是实际的变量,那为什么传入的变量的值在函数执行后发生了变化?

另外,为什么我会在第 3 行收到一条警告,上面写着:No previous prototype for function 'exchangeValues'

谢谢!!

#import <Foundation/Foundation.h>

void exchangeValues (int *pint1, int *pint2) {
    int temp;

    temp = *pint1;
    *pint1 = *pint2;
    *pint2 = temp;
}

int main (int argc, char *argv[]) {
    @autoreleasepool {
        void exchangeValues (int *pint1, int *pint2);
        int il = -5, i2 = 66, *p1 = &il, *p2 = &i2;

        NSLog(@"il = %i, i2 = %i", il, i2);

        exchangeValues(p1, p2);
        NSLog(@"il = %i, i2 = %i", il, i2);

        exchangeValues(&il, &i2);
        NSLog(@"il = %i, i2 = %i", il, i2);
    }
    return 0;
}

输出:

2012-08-02 11:13:38.569 Test[381:707] il = -5, i2 = 66
2012-08-02 11:13:38.571 Test[381:707] il = 66, i2 = -5
2012-08-02 11:13:38.572 Test[381:707] il = -5, i2 = 66

【问题讨论】:

  • int temp; 变成int *temp 否则它可能看起来 temp 是一个整数(在这种情况下它被用作指向 int 的指针)
  • @RamchandraApte 不,int 在这里是正确的,temp = *pint1; 将值 pint1 存储在 temp 中。
  • @DanielFischer 正确,我不太习惯 C/C++(我是 Pythonista)

标签: objective-c function pointers


【解决方案1】:

如果你正在学习指针,我会说这是一个复杂的例子!

函数的参数中是否发生了某种转换 将 p1、p2、&il 和 &i2 转换为指针的值 (*)?喜欢 p1 变成*p1?

p1p2 被声明为int *(指向int),并使用i1i2 的地址进行初始化(使用&amp; 运算符)。

我认为变量的副本被传递到函数中 实际变量的值,那么为什么传入变量的值是 函数后改了吗?

变量的副本被传递给函数,但在本例中是int * 类型的变量(指向int 的指针)。值发生变化的原因是exchangeValues() 函数正在取消引用这些指针并交换值。这是函数可以在其自身范围之外修改变量的唯一方法(在 C/Objective-C 中),而不是将变量分配为函数的返回值。

还有为什么我会在第 3 行收到一条警告,上面写着:No previous 函数'exchangeValues'的原型?

你好像打错了;删除@autoreleasepool下面的行:

@autoreleasepool {
    void exchangeValues (int *pint1, int *pint2);   <-- delete this line

【讨论】:

  • 但是为什么&i1和&i2允许传入呢?当这两个被传入时会发生什么?
  • 记住&i1是i1的地址,在这个例子中和你的指针p1是一样的(这是你需要能够用箭头画盒子到另一个盒子经典指针图的地方; )
  • 换句话说 &i1 和 p1 的类型是 int *。由于类型是等效的并且与函数参数类型匹配,因此它们被“允许”作为参数传递给该函数
【解决方案2】:

如果将指针传递给函数,它确实传递了该指针的副本——但它仍然指向内存中的相同地址。因此,取消引用该指针仍将指向函数范围之外的变量。

【讨论】:

    【解决方案3】:

    我以为是变量的副本传入了函数而不是实际的变量,那为什么在函数之后传入的变量的值发生了变化?

    指针的副本被传递给这里的函数。所以函数的内容指向变量l1l2 存储的内存位置。所以

    void exchangeValues (int *pint1, int *pint2) {
        int temp;
    
        temp = *pint1;   // store the value that pint1 points to in temp
        *pint1 = *pint2; // store the value pint2 points to where pint1 points to
        *pint2 = temp;   // store the value saved in temp where pint2 points to
    }
    

    【讨论】:

      【解决方案4】:

      变量是如何连续声明和初始化的有点令人困惑,但基本上你有:

      i1 是一个 int 设置为 -5 p1 是指向int 的指针,该地址设置为i1 的地址

      i2p2 也是如此

      没有发生转换。您实际上是在“交换”这些指针在函数中指向的值。

      指针是令人困惑的事情,但坚持下去,只要有足够的parctice和这样的示例代码,它就会变得清晰......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 2014-09-26
        • 1970-01-01
        • 2013-10-25
        相关资源
        最近更新 更多