指针
存储空间用于存放数据、变量, 既然有存储空间,那么就必然有存储空间的地址,很多时候, 需要知道这个空间的地址,再把数据存储到这个空间上去, 类似于快递包裹,需要对方提供邮寄地址, 再在快递单上写上对方的地址。这样就需要一个类似快递单的东西, 用于记录地址。C 语言编程中,操作的都是各种变量,这类指向地址的变量,叫做指针变量,简称为指针, 它就起快递单的作用。 空白快递单就是没有赋值的指针,写上地址的快递单,就是赋值了的指针。《c 程序设计语言》 是这样描述 : ”指针是一种保存变量地址的变量“ 。所有的指针都存储了内存地址。它们的类型只在取值时起作用
指针的一些概念:
1、 定义指针: byte * pointer; // 该指针没有赋值也叫未初始化指针,有内存地址,并且是垃圾地址
2、 获取变量地址: byte i; pointer = &i;
3、 定义指针的指针:byte ** pointer;
4、 定义函数指针: void (*function)(void); // 仅函数名前加’*’。
5、 数组名,函数名,就是指向这个数组和函数的首地址。
6、 强制类型转换: (byte *)0x0001; // 常数强制类型转化为字节类型地址。
7、 void型指针 : void *vptr; // void指针可以指向任意类型指针或引用
8、 空指针: void *nptr = null; // 空指针被初始化位0,而不是随机地址
* 既可以用来声明一个指针变量,也可以用作指针的取值。当用在声明一个变量时,*表示这里声明了一个指针。其它情况用到*表示指针的取值,获得指针指向地址的值
& 是地址操作符,用来引用一个内存地址。通过在变量名字前使用&操作符
. 结构指向成员
-> 指针指向成员
指针的几个概念
1.指针的类型
基本数据类型比如 int、char ,还有 一些复杂的比如 int (*p)[], 指向数组的指针,像这种的判断就是指针名字去掉 , 指针的类型类型就是 int(*)[],其实就是指向数组的指针
2.指针所指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。 你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。
例如:int*ptr:指针所指向的类型是int int(*ptr)[3]:指针所指向的的类型是int()[3]
每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?
int a[5] = {1,2,3,4,5};
int *p = (int *)(&a+1);
NSLog(@"%d,%d", *(a+1), *(p-1));
&a得出来的是指向数组的指针,所以&a+1其实是以数组的长度为单位来移动的。如果你只是想要得到数组的第二个元素的话,那么就用*(&a[0]+1),因为&a[0]的数据类型是int* 。(int *) 将指针类型强制转换位int*
a是数组名,是指向数组第一个元素的指针,毫无疑问,在这里,数组第一个元素的数据类型是int所以a的数据类型是就是int*。
&a是对一个一维数组取地址,得出来的是指向数组的指针(在这里是pointer to array of int), 也就是int(*)[5]。
&a[0]就很简单,首先a[0]得到的是一个整形数int,然后对它取地址,所以它的数据类型就是int*。
1.int *p; // 一个指向整型数据的指针
2.int **p; // 一个指针的指针,它指向的指针指向一个整型数据
3.int *p[10]; // 一个有十个指针的数组,该指针指向整型数据
4.int (*p)[10]; // 一个指向有十个整型数据数组的指针
5.int *p(int); // 就一个函数(不是函数指针),该函数有一个整型参数,返回值为一个指向整型的指针
6.int (*p)(int); // 一个函数指针,该函数有一个整型的参数,返回值为整型类型
7.int (*p[10])(int); // 一个有十个指针的数组,该数组中的指针指向一个函数,该函数有一个整型参数并返回一个整型数