这是指针系列的第一篇
既然是第一篇,肯定就是指针初阶了,废话不多说,开整.
目录
1.内存和地址
指针的和内存分不开.
内存是一个抽象名词
打个比方:
内存是长街上的一排房屋,每座房子都可以容纳数据,每座房子都有自己的标号,人们通过房子的标号回自己的家.
(房子的标号就是地址,每个标号指向对应的房子,我们就把这叫做每个地址指向特定的内存)
在C语言初阶,我们只需要把内存理解为一个又一个的内存块.
地址:一般用十六进制表示
例:(注:%p是打印地址的格式)
0133FA38就是a的地址.
0x0133FA38是什么?
等价于0133FA38,0x表示它是一个十六进制数.
----------大概对内存和地址有个感觉------
2.指针变量的内容、类型
指针的内容是一个地址.
指针的类型有很多种
int*
short *
long*
float*
double*
等等等等
类型 + * 表示一个指针类型
值得一提的是:void*是万能指针,可接受任何类型的地址,那为什么还需要其他类型的指针呢,这个在第二节里讲!
例题:int a=10;
创建一个指针指向存储a的那块内存,也即创建一个指向a的指针,怎么做?
指针是个变量,是变量就有类型(void也是一种类型)
所以先确定指针的类型,再确定指针里面放什么
one:指针的类型怎么确定?
int a=10,a是一个整型,要用整型指针接收,整型指针:int*
two:指针里面放什么?
指针的值是一个地址,用取地址符取a的地址放入指针变量.
综上 得出: int* pa=&a;
整合:
那么float b=3.14,double c=3.1415926可以怎么创建指向它们的指针?
不妨打开自己的编译器试试吧!
上面的同一段代码我执行了两遍,打印的都是pa的值,那你发现了什么?
两次的结果是不同的
小知识:系统分配内存时随机的,虽然是同一个变量,但是系统开辟的空间是不同的(有些时候碰巧相同)
小结:指针变量里放的是一个地址,类型多种多样.
----------知道指针的值和类型
3.间接访问操作符(解引用操作符)
还记得开篇讲的那个例子吗?
一排房子,有对应的标号(门牌号),人们通过标号回家
现在人们走到了家门口,怎么进去?用钥匙呗...
那什么是钥匙?解引用操作符(*)就是这把钥匙
当你走到了家门口,掏出这个大宝贝就能进家门访问里面的数据了
解引用操作符功能:通过一个地址访问地址里对应的数据
int main()
{
int a = 10;
int* pa = &a;
int b = *pa;
printf("%d\n", b);
//b的值是多少?
return 0;
}
b通过pa和解引用操作符*访问到了a的值,并将a里的数据拷贝到了b
小结:*是解引用操作符,可寻址访问地址里对应的内容.
4.总结
人们通过地址来给内存标号,内存像一个容器
&可以取到变量的地址,取到的地址可以放入指针(变量)中
指针变量本质上还是一个变量,不过变量存的是是一个地址罢了
地址的本质也不过是一串数字
可以用 * 解引用地址来访问地址对应的内容
-----
一分钟学完本节内容
理解下面这几句代码背后的东西就是这节的主要内容!
--------------
如果有启发的话,留个赞再走吧,这对我帮助很大!
不点?