您的位置:首页 > 移动开发 > Objective-C

【IOS 开发学习总结-OC-7.7-★★】 objective-c——指针

2015-09-14 15:08 447 查看
指针是 C 语言的一个重要概念。OC 系统类型的变量,自定义类型的变量都是指针。

指针的概念

定义一个变量后,程序运行过程中,该变量保存在内存中,那要使用该变量的值有这样2种方法:

1.通过变量来访问它的值。——直接访问

2.到该变量的存储位置去取它的值。——间接访问

操作系统会为每个内存单元进行编号,这个编号就是内存单元的地址。指针也就是指这些单元的内存地址。简单的说,变量的内存地址就是该变量的指针,而用于保存内存地址(指针)的变量就是指针变量。

为什么32位的操作系统最大只能支持4G 内存呢?



指针变量及基本用法

定义指针变量的语法格式:
类型* 变量名;
*代表指针类型变量。

指针变量不能保存普通的值,只能保存变量的地址,也就是只能保存指针。

关于指针的2个基本的运算符:

- &:取地址运算符,用于读取后面变量的保存地址。是单目运算符,后面紧跟一个变量,

- *:取变量运算符,用于读取该指针变量所指的变量。单目运算符,后面紧跟一个指针变量。

说明:*和&2个运算符的优先级相同,都是从右向左运算。

指针变量和被指向变量的关系,示例代码:

#import <Foundation/Foundation.h>

int main(int argc , char * argv[])
{
    @autoreleasepool{
        // 定义一个int型变量
        int a = 200;
        // 定义一个指向int变量的指针
        int* p;
        // 将a变量的指针(内存地址)赋值给p指针变量
        p = &a;
        // *p表示取出p指针所指变量
        NSLog(@"%d" , *p);
        // 对a变量先取指针,再获取该指针所指变量,又回到变量a,
        // 因此下面代码将输出1(代表真)
        NSLog(@"%d" , a == (*(&a)));
    }
}


指针变量的2个规则:

1.定义指针变量时,必须用*来标识定义一个指针变量。

2.所有指针变量必须先声明,后使用。一旦声明了指针变量的类型,那么这种类型的指针变量,只能指向对应类型的变量。如:
int* p;
语句声明的拜年了 p只能指向 int 类型的变量。

指针变量作为函数参数:

函数的形参可以是普通变量,也可以是指针变量。

使用指针变量作为形参对变量进行交换,示例代码:

#import <Foundation/Foundation.h>

void swap(int* p1 , int* p2)
{
    // 将p1所指变量的值赋给tmp
    int tmp = *p1;
    // 将p2所指变量的值赋给p1所指的变量
    *p1 = *p2;
    // 将tmp变量的值赋值给p2所指的变量
    *p2 = tmp;
    // 将p1、p2两个指针赋为nil,也就是不指向任何地址
    p1 = p2 = nil;  // ①
}
int main(int argc , char * argv[])
{
    @autoreleasepool{
        int a = 5;
        int b = 9;
        // 定义指针变量pa保存变量a的地址
        int* pa = &a;
        // 定义指针变量pb保存变量b的地址
        int* pb = &b;
        // 调用swap()函数对a、b交换a、b两个变量的值
        swap(&a , &b);
        NSLog(@"a的值为:%d,b的值为:%d" , a , b);
        // 再次输出pa、pb指针变量的值(内存地址)
        NSLog(@"pa的值为:%p,pb的值为:%p" , pa , pb);
    }
}


运行程序后,看到 a,b 的值实现了交换;pa,pb 的值为16进制的数——内存地址(每次运行输出的内存地址通常是变化的,说明 变量a,b 的内存单元是动态分配的)。

关于这部分程序的运行分析,详情可以参阅《疯狂 ios 讲义(上)》 一书P127-129页。

我在这里简单贴下运作的分析图,供大家自己思考体会:












C 语言的传参机制是值传递——副本传递,这里也是一样。所以,如果使用函数参数是普通类型的变量,函数中对变量做任何更改都不会影响变量本身。如果需要在函数中对变量本身进行修改,就需要将该变量的指针(内存地址)传入参数,并在函数中对该指针所指的变量进行修改,即可改变原变量的值。

小提示:

由于数组变量本身也是指针,所以,将数组变量作为参数传入函数时,在函数中对数组元素做的更改会影响原数组元素的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: