终于写到指针了,真是太不容易了,我觉得,指针对于C来说太重要了!真的非常非常重要!
为什么需要指针
指针解决了一些编程中基本的问题。
- 指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果,但是这样往往效率不太好,因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能。但使用指针就可以很好的避免这个问题,因为任何类型的指针占用的字节数都是一样的(根据平台不同,有4字节或者8字节或者其他可能)。
- 指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。
- 有些操作必须使用指针。如操作申请的堆内存。还有:C语言中的一切函数调用中,值传递都是“按值传递”的,如果我们要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。
指针是什么
我们指知道:
- C语言中的数组是指 一类 类型,数组具体区分为 int 类型数组,double类型数组,char数组 等等。同样指针 这个概念也泛指 一类 数据类型,int指针类型,double指针类型,char指针类型等等。
- 通常,我们用int类型保存一些整型的数据,如 int num = 97 , 我们也会用char来存储字符: char ch = 'a'。
- 我们也必须知道:任何程序数据载入内存后,在内存都有他们的地址,这就是指针。而为了保存一个数据在内存中的地址,我们就需要指针变量。
- 因此:指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。
定义指针
- int a = 10;
- int *p = &a;
- char b = ‘K’;
- char *w = &b;
运算符
- 1---- &
- 取地址符:获取数据的内存地址
- 2---- *
- 1、定义指针变量时代表类型的一部分
- 2、指针解引用:通过地址获取地址里的内容(钥匙)
- 3、指针的降级(行指针-->列指针)
- 3---- +-
- 指针加减:加减的是单位长度。
- 单位长度:由指向数据类型所占的字节数决定。
- 4---- []
- 指针加单位长度后,取内容运算
- a[i] 《==》 *(a+i)
指针与数组
- int a[5] = {0,1,2,3,4}; //a:20字节
- int *p = a; //p:4字节
p[3] <==> *(p+3) //p是变量
a[3] <==> *(a+3) //a是常量
数组指针
数组指针:本质是指针,专用于存储数组的地址,多数用于指向二维数组
char a[3][4] = {0};
char (*p)[4] = a; //size == 4;
a[i][j]; <==> *(a[i]+j); <==> *(*(a+i)+j);
p[i][j]; <==> *(p[i]+j); <==> *(*(p+i)+j);
a:地址常量(不可写的内存地址值)
p:指针变量(专用于存储地址的变量)
数组指针
指针数组:本质是数组,元素是指针
int *p[3];
元素类型:int *
数组名字:p
元素个数:3
二级指针
short a = 10; //size == 2
short *p = &a; //size == 4
short **w = &p; //size == 4
w <==> &p
*w <==> p <==> &a;
**w <==> *p <==> a;
void
void *p; //泛型指针,使用时需要强制类型转换
const
const int * p; //常量化*p
int * const w; //长量化w
NULL
NULL 《==》 0 //防止野指针的形成