传递函数指针的困惑

时间:2012-08-02 15:31:57

标签: objective-c function pointers

我正在读一本书来学习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

4 个答案:

答案 0 :(得分:2)

如果你被教导指针,我会说这是一个复杂的例子!

  

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

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

  

我认为该变量的副本已传递到函数中   实际变量,为什么是传入的变量的值   在功能之后改变了吗?

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

  

另外,为什么我会在第3行收到警告:没有以前   函数'exchangeValues'的原型?

你好像输了错了;删除@autoreleasepool下方的行:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

  

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

指针的副本将传递给此处的函数。那么函数指向存储位置的变量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
}

答案 3 :(得分:0)

有点令人困惑的是如何将变量声明并初始化为像这样的行,但基本上你有:

i1是设置为int的{​​{1}} -5是指向设置为p1

地址的int的指针 {p>同样适用于i1i2

没有转换。您有效地“交换”了这些指针在函数中指向的值。

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