看官们,大家好,我们在上一回中介绍了复合类型中的数组,这一回中我们将介绍复合类型中的指针。
指针是C语言中非常重要的部分,OC继承了C中的指针,因此我们可以在OC编程中继续使用它。指针也是一个变量,只不过它的是一个特殊的变量,特殊之处在于它的值是内存地址,这些地址可以是任意的内存地址,如果地址是其它变量的地址,那么就可以使用指针间接地访问变量。如果地址是无效的地址,那么使用这种无效的地址会引起程序异常。这也是使用指针特别需要注意的地方。接下来我们通过具体的代码来演示如何使用指针。
#import<Foundation/Foundation.h>
int main() {
int intValue = 3;
int *pIntValue = &intValue;
NSLog(@"value: %i , pointer value: %i",intValue,*pIntValue);
int array[3] = {1,3,5};
int *p = array;
for(int i=0; i<sizeof(array)/sizeof(array[0]);i++)
NSLog(@"value: %i",*(p+i));
NSLog(@"address of p: %p",p);
p = nil;
NSLog(@"address of p: %p",p);
char *pStr = "apple";
if(pStr != nil) {
NSLog(@"string: %s",pStr);
pStr = nil;
}else {
NSLog(@"pStr is nil");
}
return 0;
}
编译并且运行上面的程序,可以得到以下运行结果:
2020-10-31 21:12:45.651 ex.out[1734:84897] value: 3 , pointer value: 3
2020-10-31 21:12:45.651 ex.out[1734:84897] value: 1
2020-10-31 21:12:45.652 ex.out[1734:84897] value: 3
2020-10-31 21:12:45.652 ex.out[1734:84897] value: 5
2020-10-31 21:12:45.652 ex.out[1734:84897] address of p: 0x7ffee91cdabc
2020-10-31 21:12:45.652 ex.out[1734:84897] address of p: 0x0
2020-10-31 21:12:45.652 ex.out[1734:84897] string: apple
我们分析一下上面的代码,在代码中我们定义了指针变量pIntValue,它和普通变量定义时的区别就是多了一个号,这就是指针的特征:在基本类型名称后面加上号就定义了一个与基本类型匹配的指针变量。
大家看看,我们上面的代码中一共有几个指针变量?答案是3.
一个int类型的指针变量pIntValue;第二个是int数组类型的指针变量p;第三个是char类型的指针变量pStr。有看官问:指针也有类型吗?答案是有。通过类型可以限制指针的运行范围,比较我们在上面代码中的p+i就是使用指针在计算变量的地址,如果没有类型限制指针,那么这种运算就会出错,因为程序无法知道指针加一后跳转到哪个内存地址上。
我们通过第一个指针可以明白指针的定义,而且可以从程序输出中看到指针中的具体存放的数值(address of p: 0x7ffee91cdabc)
我们接着看一下第二个指针,它指向了一个数组,因为在OC中数组名可以看作是地址,因此这样做符合OC语法。我们在输出数组中成员的数值时,使用了指针加法运算,它和使用数组下标输出数组中成员的数值效果相同。
最后,我们看一下第三个指针,它指向了一个字符串,我们可以把指针当作字符串来使用,这也是字符串的典型用法。最后要注意的是,指针使用完成后把它设置为空指针:nil,这样可以避免程序异常。注意一下空指针:OC使用nil,C使用NULL.这是他们的不同。
最后我们对本章回中的知识点进行回顾和总结:
- 1.介绍了指针的定义和使用方法,实实在在地看到了指针的数值;
- 2.指针有类型,用来限制指针的运算;
- 3.数组名称和字符串可以看作是指针;
- 4.指针使用完就设置为空指针,空指针使用nil表示;
看官们,欲知后事如何且听下回分解!