一、指针是什么
指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
指针就是变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)
二、为什么存在指针
将计算机的内存分成了很多个小的单元,每个单元都对应独一无二的地址,这样就一个地址标示一块空间。
在这里我们还要明白:
1)指针(指针变量)是存放地址才出现的,地址(指针)是为了标志一块地址空间的
2)指针(指针变量)让地址有地方可存,同时让内存的访问更加方便
3)指针的大小在32位平台下是4个字节,在64位平台下是8个字节
三、指针和指针类型
指针式有类型的类型:
type + *(type决定了指针每次需要连续读取多少字节的内容):
(1)int*ptr;//指针的类型是int*
(2)char*ptr;//指针的类型是char*
(3)int**ptr;//指针的类型是int**
(4)int(*ptr)[3];//指针的类型是int(*)[3]
(5)int*(*ptr)[4];//指针的类型是int*(*)[4]
(2)char*ptr;//指针的类型是char*
(3)int**ptr;//指针的类型是int**
(4)int(*ptr)[3];//指针的类型是int(*)[3]
(5)int*(*ptr)[4];//指针的类型是int*(*)[4]
对指针+1,是将其加上所指向类型的大小:
char *pc = NULL, pc++; --> 加1个字节
int *pi = NULL, pi++; --> 加4个字节
float *pf = NULL, pf++; --> 加4个字节
指针的解引用
指针所指向的目标变量
总结:指针的类型决定了,对指针解引用的时候有多大权限(能操作几个字节)
比如:char*的指针解引用就只能访问一个字节,而int *的指针的解引用就能访问四个字节。
四、二级指针
二级指针就是存放一级指针的地址。
五、指针表达式解析
char ch = 'a'; char *cp = &ch;
那下面代码能否做左值?能否做右值?
&ch; --> 右值 --> 地址常量
cp; --> 左值、右值 --> 指针变量
&cp; --> 右值 --> 地址常量
*cp+1; --> 右值 --> 表达式的结果是常量
*(cp+1); --> 左值、右值 --> 表示ch之后的一块空间
++cp; --> 右值 --> c语言中前置++只能做右值
cp++; --> 右值 --> c语言中后置++只能做右值
*(++cp); --> 左值、右值 --> 表示ch之后的一块空间
*(cp++); --> 左值、右值 --> 使用ch变量之后指向ch之后的一块空间
++*cp; --> 右值 --> c语言中前置++只能做右值
(*cp)++; --> 右值 --> c语言中后置++只能做右值
++*++cp; --> 右值 --> c语言中前置++只能做右值
++*cp++; --> 右值 --> c语言中后置++只能做右值
六、指针运算
1.指针+-整数
每次加减1是加减其所指向类型的大小
2.指针-指针
指向同一数组的两个指针相减,计算的是两指针之间的元素个数,元素的类型由这两个指针的类型决定
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个位置的指针比较(越界访问)
不允许与指向第一个元素之前的那个内存为止的指针进行比较