Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 向函数传递指针时的混淆_Objective C_Function_Pointers - Fatal编程技术网

Objective c 向函数传递指针时的混淆

Objective c 向函数传递指针时的混淆,objective-c,function,pointers,Objective C,Function,Pointers,我正在读一本学习Objective-C的书,这个程序应该展示处理指针的关键概念,我真的迷路了 函数的参数中是否发生了某种转换,将p1、p2、&il和&i2转换为指针的值(*)?像p1变成*p1 我认为变量的一个副本被传递到函数中,而不是实际的变量,那么为什么传入变量的值在函数之后发生了变化 还有,为什么我在第三行得到一个警告,上面写着:函数“exchangeValues”没有以前的原型。 谢谢 #import <Foundation/Foundation.h> void excha

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

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

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

还有,为什么我在第三行得到一个警告,上面写着:
函数“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;
}

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

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

这有点让人困惑,变量是如何在一行中声明和初始化的,就像这样,但基本上您有:

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

这同样适用于
i2
p2

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


指针会让事情变得混乱,但坚持使用它,足够多的语法和示例代码会让事情变得清晰…

有点让人困惑的是,变量是如何声明和初始化的,所有这些都是这样一行的,但基本上你有:

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

这同样适用于
i2
p2

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

指针是令人困惑的东西,但坚持使用它,它会变得清晰,有足够的语法和示例代码像这样

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

指针的副本被传递给函数。因此,函数的内容指向变量
l1
l2
存储的内存位置。所以

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
}
我认为变量的一个副本被传递到函数中,而不是实际的变量,那么为什么传入变量的值在函数之后发生了变化

指针的副本被传递给函数。因此,函数的内容指向变量
l1
l2
存储的内存位置。所以

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
}

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

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

p1
p2
声明为
int*
(指向
int
)并使用
i1
i2
的地址进行初始化(使用
运算符)

我以为变量的副本被传递到函数中了 那么,为什么传入变量的值是 功能完成后发生了什么变化

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

还有,为什么我在第三行收到警告:没有以前的 函数“exchangeValues”的原型

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

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

void-exchangeValues(int*pint1,int*pint2);如果你在学习指针,我会说这是一个复杂的例子

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

p1
p2
声明为
int*
(指向
int
)并使用
i1
i2
的地址进行初始化(使用
运算符)

我以为变量的副本被传递到函数中了 那么,为什么传入变量的值是 功能完成后发生了什么变化

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

还有,为什么我在第三行收到警告:没有以前的 函数“exchangeValues”的原型

您似乎输入错误;请删除下面的行
@autoreleasepool

@autoreleasepool {
    void exchangeValues (int *pint1, int *pint2);   <-- delete this line
@autoreleasepool{
无效交换evalu