本专栏介绍:免费专栏,并且会持续更新C语言知识,欢迎各位订阅关注。
关注我,带你了解更多关于机器人、嵌入式、人工智能等方面的优质文章,坚持更新!
大家的支持才是更新的最强动力!
文章目录
- 一、空指针与野指针
- 1.1 空指针
- 1.2 野指针
- 二、对古怪指针的解读
- 2.1 *p++的解读
- 2.2 *++p的解读
- 2.3 (*p)++的解读
- 2.4 ++(*p)的解读
- 三、指针的运算
- 四、指针管理字符串
- 总结
一、空指针与野指针
1.1 空指针
概念:指针变量指向内存中编号为0的空间。
作用:初始化指针变量。
注意:空指针指向的内存是不可以访问的,因为0-255之间的内存编号是系统占用的。
int main() {
//设置为空指针,即初始化
//指针变量p指向内存地址编号为0的空间int *p = NULL;
//但是不能访问空指针报错,或是其他编号的也不行
//因为内存编号0-255为系统占用内存,不允许用户访问cout << *p << endl;system("pause");
}
1.2 野指针
概念:指针变量指向非法的内存空间
因此在程序中应当避免出现野指针。
二、对古怪指针的解读
*p++、*++p、(*p)++、++(*p)
2.1 *p++的解读
由于这个写法不好显示,以下均用“它”来代指。它就相当于*(p++),因为++的优先级高于*,所以p先跟++结合然后跟星号结合。
但是因为++是后置的,本身的含义就是先运算后增加1,运算指的是 p++整体与前面的星号运算,然后再增加1,所以实际上* p++整体对外表现的是*p的值,运算完成后再加1。所以 *p++等同于:*p; p+=1;
2.2 *++p的解读
*++p等同于p+=1; * p;也就是先加1,然后再 *。
2.3 (*p)++的解读
(* p)++使用()强制将和p结合,只能先计算p,然后对*p整体的值+,也就是对p所指向的变量的数值进行+1操作。
2.4 ++(*p)的解读
先*p取地址值,再前置++,该值+1后作为整个表达式的值。
三、指针的运算
指针本身也是变量,因此可以进行运算。但是因为指针变量本身表示的是某个其他变量的地址值,因此该值进行*、/、%运算是无意义的。其次,两个指针本身相加也同样没有意义。
但是指针+1和-1是有意义的。
+1:表示指向指针所指向的格子(地址)向后移动一格;
-1:表示向前移动一格。
这里注意:+1是移动的格子,也就是一个格子代表的内存大小,等于数组的数据类型所占用的内存字节数,而不一定就是1个字节(相当重要的理解)。通过下面的代码输出的结果就可以证明这一点。
四、指针管理字符串
(1)C语言中定义字符串方法:char *p = “linux”;此时p就叫做字符串,但是实际上p只是一个字符指针(本质上就是一个指针变量,只是p指向了一个字符串的起始地址而已)。
(2)C语言中字符串的本质:指针指向头、固定尾部的地址相连的一段内存
(3)C语言中字符串有3个核心要点:
一、用一个指针指向字符串头;
二、固定尾部(字符串总是以’\0’来结尾);
三、组成字符串的各字符彼此地址相连。
(4)‘\0’是一个ASCII字符,其实就是编码(值)为0的那个字符(真正的0,和数字0是不同的,数字0有它自己的ASCII编码)。要注意区分’\0’和’0’和0.(0等于’\0’,‘0’等于48,带有’’表明是字符0,而不是数字(编码值)0)
(5)’\0’作为一个特殊的数字被字符串定义为(幸运的选为)结尾标志。产生的副作用就是:字符串中无法包含’\0’这个字符。(C语言中不可能存在一个包含’\0’字符的字符串),这种思路就叫“魔数”(魔数就是选出来的一个特殊的数字,这个数字表示一个特殊的含义,你的正式内容中不能包含这个魔数作为内容)。
注意:指向字符串的指针和字符串本身是分开的两个东西
char *p = “linux”;在这段代码中,p本质上是一个字符指针,占4字节;"linux"分配在代码段,占6个字节;实际上总共耗费了10个字节,这10个字节中:4字节的指针p叫做字符串指针(用来指向字符串的,理解为字符串的引子,但是它本身不是字符串),5字节的用来存linux这5个字符的内存才是真正的字符串,最后一个用来存’\0’的内存是字符串结尾标志(本质上也不属于字符串)。
注意:这个打印出来的不是“Y”,而是整个数组(字符串)。
总结
(1)
(2)++符号和指针结合,总共以上四种情况。–和++的情况很类似。