【IOS 开发学习总结-OC-7.7-★★】 objective-c——指针
2015-09-14 15:08
447 查看
指针是 C 语言的一个重要概念。OC 系统类型的变量,自定义类型的变量都是指针。
1.通过变量来访问它的值。——直接访问
2.到该变量的存储位置去取它的值。——间接访问
操作系统会为每个内存单元进行编号,这个编号就是内存单元的地址。指针也就是指这些单元的内存地址。简单的说,变量的内存地址就是该变量的指针,而用于保存内存地址(指针)的变量就是指针变量。
指针变量不能保存普通的值,只能保存变量的地址,也就是只能保存指针。
关于指针的2个基本的运算符:
- &:取地址运算符,用于读取后面变量的保存地址。是单目运算符,后面紧跟一个变量,
- *:取变量运算符,用于读取该指针变量所指的变量。单目运算符,后面紧跟一个指针变量。
说明:*和&2个运算符的优先级相同,都是从右向左运算。
指针变量和被指向变量的关系,示例代码:
指针变量的2个规则:
1.定义指针变量时,必须用*来标识定义一个指针变量。
2.所有指针变量必须先声明,后使用。一旦声明了指针变量的类型,那么这种类型的指针变量,只能指向对应类型的变量。如:
使用指针变量作为形参对变量进行交换,示例代码:
运行程序后,看到 a,b 的值实现了交换;pa,pb 的值为16进制的数——内存地址(每次运行输出的内存地址通常是变化的,说明 变量a,b 的内存单元是动态分配的)。
关于这部分程序的运行分析,详情可以参阅《疯狂 ios 讲义(上)》 一书P127-129页。
我在这里简单贴下运作的分析图,供大家自己思考体会:
C 语言的传参机制是值传递——副本传递,这里也是一样。所以,如果使用函数参数是普通类型的变量,函数中对变量做任何更改都不会影响变量本身。如果需要在函数中对变量本身进行修改,就需要将该变量的指针(内存地址)传入参数,并在函数中对该指针所指的变量进行修改,即可改变原变量的值。
小提示:
由于数组变量本身也是指针,所以,将数组变量作为参数传入函数时,在函数中对数组元素做的更改会影响原数组元素的值。
指针的概念
定义一个变量后,程序运行过程中,该变量保存在内存中,那要使用该变量的值有这样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 语言的传参机制是值传递——副本传递,这里也是一样。所以,如果使用函数参数是普通类型的变量,函数中对变量做任何更改都不会影响变量本身。如果需要在函数中对变量本身进行修改,就需要将该变量的指针(内存地址)传入参数,并在函数中对该指针所指的变量进行修改,即可改变原变量的值。
小提示:
由于数组变量本身也是指针,所以,将数组变量作为参数传入函数时,在函数中对数组元素做的更改会影响原数组元素的值。
相关文章推荐
- unable to start the daemon process:could not reserve enough space for object heap.
- 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)
- OC-字符串,数组,字典练习题
- 【iOS】Objective-C与JavaScript的交互
- Objective-C 【NSMutableArray】
- 黑马程序员——Objective--C基础笔记之内存管理(一)
- ***-[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from ob
- SQL sysobjects 表 详解
- Objective-C学习-KVC(键值编码)和KVO(键值观察)
- 【IOS 开发学习总结-OC-7.6-★】objective-c ——块(Block)
- objective-C 中两种实现动画的方法(转)
- Objective-C - category学习笔记
- Objective-C - protocol学习笔记
- 【IOS 开发学习总结-OC-7.5】objective-c 的c语言特性——结构体
- Objective-C 【NSMutableString】
- Objective-C 【NSArray 的基本使用&常见方法&简写形式】
- Objective-C学习-数组排序问题
- Objective-C - OC访问器学习笔记
- Object-API-NSLog
- 'dict' object has no attribute 'has_key'