我正在读一本书来学习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
答案 0 :(得分:2)
如果你被教导指针,我会说这是一个复杂的例子!
函数的参数中是否发生了某种转换 将p1,p2,&amp; il和&amp; i2转换为指针的值(*)?像p1一样 变成* p1?
p1
和p2
被声明为int *
(指向int
的指针),并使用i1
和i2
的地址进行初始化(使用&
运算符。
我认为该变量的副本已传递到函数中 实际变量,为什么是传入的变量的值 在功能之后改变了吗?
将变量的副本传递给函数,但在本例中为int *
类型的变量(指向int
的指针)。值更改的原因是exchangeValues()
函数正在取消引用这些指针并交换值。这是唯一的方法(在C / Objective-C中)函数可以修改自己范围之外的变量,而不是将变量赋值为函数的返回值。
另外,为什么我会在第3行收到警告:没有以前 函数'exchangeValues'的原型?
你好像输了错了;删除@autoreleasepool
下方的行:
@autoreleasepool {
void exchangeValues (int *pint1, int *pint2); <-- delete this line
答案 1 :(得分:1)
如果将指针传递给函数,它确实传递了该指针的副本 - 但它仍然指向内存中的相同地址。因此,取消引用该指针仍将指向一个超出函数范围的变量。
答案 2 :(得分:1)
我认为变量的副本是传递给函数而不是实际变量的,所以为什么在函数之后传入的变量的值发生了变化?
指针的副本将传递给此处的函数。那么函数指向存储位置的变量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
}
答案 3 :(得分:0)
有点令人困惑的是如何将变量声明并初始化为像这样的行,但基本上你有:
i1
是设置为int
的{{1}}
-5
是指向设置为p1
int
的指针
{p>同样适用于i1
和i2
没有转换。您有效地“交换”了这些指针在函数中指向的值。
指针是令人困惑的东西,但坚持下去,它会变得清晰,有足够的parctice和像这样的示例代码......