Objective c 向函数传递指针时的混淆
我正在读一本学习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
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