Objective-C 学习笔记(五) 指针
Objective-C 指针
每一个变量是一个内存位置和每一个存储单元都有其定义的地址,可以使用符号(&)的运算符,它表示内存中的地址访问。
a. 我们定义一个指针变量
b. 分配一个指针变量的地址
c. 最后访问提供的地址指针变量的值。这是通过使用一元运算符*返回值的变量,其操作数位于指定的地址。
实例:
1 #import <Foundation/Foundation.h> 2 3 int main () 4 { 5 int var = 20; /* actual variable declaration */ 6 int *ip; /* yiibaier variable declaration */ 7 8 ip = &var; /* store address of var in yiibaier variable*/ 9 10 NSLog(@"Address of var variable: %x", &var ); //Address of var variable: 337ed41c 11 12 /* address stored in yiibaier variable */ 13 NSLog(@"Address stored in ip variable: %x", ip ); //Address stored in ip variable: 337ed41c 14 15 /* access the value using the yiibaier */ 16 NSLog(@"Value of *ip variable: %d", *ip ); //Value of *ip variable: 20 17 18 return 0; 19 }
解惑:
- ip = &var 取地址 → *ip = var 取值
- 如果指针指向NULL,地址为0
指针的算术运算
例
ptr是一个整数的指针,它指向的地址1000,假设32位的整数,执行 ptr++ 操作后,指针将指向 1004 位置
因为每次指针递增,它会指向到下一个整数的位置,这是到当前位置的下一个4个字节。此操作将指针移动到下一个内存位置,而不会影响实际值的内存位置。如果ptr指向一个字符的地址是1000,那么上面的操作将指向下一个字符的位置1001
指针递增运算
1 #import <Foundation/Foundation.h> 2 3 const int MAX = 3; 4 5 int main () 6 { 7 int var[] = {10, 100, 200}; 8 int i, *ptr; 9 10 /* let us have array address in yiibaier */ 11 ptr = var; 12 for ( i = 0; i < MAX; i++) 13 { 14 NSLog(@"Address of var[%d] = %x", i, ptr ); 15 NSLog(@"Value of var[%d] = %d", i, *ptr ); 16 17 /* move to the next location */ 18 ptr++; 19 } 20 return 0; 21 }
产生结果如下:
Address of var[0] = 7e6f2a70 Value of var[0] = 10 Address of var[1] = 7e6f2a74 Value of var[1] = 100 Address of var[2] = 7e6f2a78 Value of var[2] = 200
指向指针的指针
实例:
1 #import <Foundation/Foundation.h> 2 3 int main () 4 { 5 int var; 6 int *ptr; 7 int **pptr; 8 9 var = 3000; 10 11 /* take the address of var */ 12 ptr = &var; 13 14 /* take the address of ptr using address of operator & */ 15 pptr = &ptr; 16 17 /* take the value using pptr */ 18 NSLog(@"Value of var = %d", var ); 19 NSLog(@"Value available at *ptr = %d", *ptr ); 20 NSLog(@"Value available at **pptr = %d", **pptr); 21 22 return 0; 23 }
产生结果如下:
Value of var = 3000 Value available at *ptr = 3000 Value available at **pptr = 3000
解惑:
- var = 3000 , ptr = &var , pptr = &ptr = &&var
- *ptr = var , *pptr = ptr , **pptr = *ptr = var = 3000
参考资料: