马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
越努力,越幸运。欢迎大家来看我的笔记 ,不对的请各位大佬指正,谢谢
一、指针
(1)内存是如何存放变量的?通过变量名对变量进行访问和存储是为了方便程序员而设计的,其实在内存中完全没有存储变量名的必要。因为编译器知道具体每一个变量名对应的存放地址,所以当你读取某个变量的时候,编译器就会找到变量名所在的地址,并根据变量的类型读取相应范围的数据。(其实就一句话:变量名只是给我们和编译器看的,CPU只认地址)
(2)通常我们所说的指针,就是地址的意思。C 语言中有专门的指针变量用于存放指针,跟普通变量不同,指针变量存储的是一个地址。 指针变量也有类型,它的类型就是存放的地址指向的数据类型。(指针变量占四个字节,也就是说一个地址是占 4 个字节的空间。)
(3)定义指针变量: 类型名 *指针变量名。定义指针变量跟普通变量十分相似,只是中间多了一个星号(*)。如:char *pa; //定义一个指向字符型的指针变量
int *pb; //定义一个指向整形的指针变量
二、取地址运算符和取值运算符
(1)如果需要获取某个变量的地址,可以使用取地址运算符(&):char *pa = &a;
int *pb = &f;
(2)如果需要访问指针变量指向的数据,可以使用取值运算符(*):printf("%c, %d\n", *pa, *pb);
(3)这里要注意的是取值运算符跟定义指针用的都是星号(*),这属于符号的重用,在不同的地方有不同的意义:在定义时表示定义一个指针变量;在其他位置表示获取指针变量指向的变量的值。
(4)直接通过变量名来访问变量的值,我们称之为直接访问;通过指针变量这样的形式来访问变量的值,我们称之为间接访问,所以取值运算符有时候也叫间接运算符。
三、避免访问未初始化的指针
下面的就是血淋林的例子 :#include <stdio.h>
int main()
{
int *a;
*a = 123;
return 0;
}
(1)类似于上边这样的代码是很危险的,因为指针变量 a 到底指向哪里,我们没办法知道。这个道理就跟访问未初始化的变量一样,它的值是随机的。
(2)这在指针变量里会很危险,因为后边代码对一个未知地址进行赋值,那么你可能会覆盖到系统的一些关键代码。不过你也别高兴得太早,因为系统通常都不会允许你这么干,程序这时候会被终止并报错。
(3)更危险的是,偶尔这个指针变量里随机存放的是一个合法的地址,那么接下来的赋值就会导致那个位置的值莫名其妙地被修改。这种类型的 Bug 是非常难以排查的。所以,在对指针进行间接访问时,必须确保它们已经被正确地初始化。
ps:小知识
%p表示打印地址类型的数据,如:
谢谢小甲鱼带来的视频教程,感谢!!
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记 ,不对的请各位大佬指教,谢谢 |