0

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

函数的参数中是否发生了某种转换,将p1, p2, &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

4 回答 4

2

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

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

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

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

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

另外,为什么我在第 3 行收到一条警告,上面写着:没有函数'exchangeValues' 的先前原型?

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

@autoreleasepool {
    void exchangeValues (int *pint1, int *pint2);   <-- delete this line
于 2012-08-02T15:40:18.827 回答
1

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

于 2012-08-02T15:39:38.923 回答
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
}
于 2012-08-02T15:39:54.350 回答
0

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

i1是一个int集合 to-5 p1是一个指针,指向一个int集合的地址i1

i2和_p2

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

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

于 2012-08-02T15:39:43.117 回答