指针的介绍
所谓指针,想必大家并不陌生。在很多的教材中,都会把指针比作是一个房间号,事实上确实如此。
1.1.内存和地址
简而言之,就是把一个内存的编号记作了地址。而C语言又给这个地址起了个名字,叫指针。
1.2.编址
CPU访问内存中的某个字节空间,必须知道这个 字节空间在内存的什么位置,⽽因为内存中字节 很多,所以需要给内存进⾏编址(就如同宿舍很多,需要给宿舍编号⼀样)。
计算机的编址是有硬件控制的,本质上是一种约定俗成的共识。
计算机内是有很多的硬件单 元,⽽硬件单元是要互相协同⼯作的。但是硬件之间又是彼此独立的存在,所以要用“线”把他们来连接起来,CPU和内存也是如此。
我们看一下地址总线。
一般来说,我们可以简单的理解为32位机器有32个地址总线。每根线有两个状态,有脉冲或者没有,分别用1和0代表。
1.3.&和*
&操作符是取出一个数据的地址,*是解引用操作。
比如下边这个代码,用p来接受a的地址。p的类型的int*,也就是int类型的指针。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
int a = 10;
int* p = &a;
printf("%d,%d\n", a, *p);
printf("%p,%p\n", &a, p);
return 0;
}
根据运行结果可以看出他们的等效。
1.4.简单运用
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
int a = 10;
int* p = &a;
printf("%d,%d\n", a, *p);
*p = 0;
printf("%d,%d\n", a, *p);
return 0;
}
可以看出,a的值通过*p直接改变了。
1.5.指针变量的大小
在32位和64位的前提下,指针的大小是不一样的,在x64的条件是8个字节,在x86的条件下,大小是4。
因为指针的大小和指针的类型没有关系,指针的类型只会影响指针解引用后的步长。所以这里只使用一个int*类型的指针。
1.6.const修饰指针
直接搬出结论。
1.7.规避野指针
一般来说,我们说一个指针是一个野指针,并不是说只要没有初始化就是一个野指针。而是指针在使用的时候,要有一个合法的空间,而不是非法的访问内存。
1.8.assert断言
使用assert()函数断言的时候需要一个头文件<assert.h>。如果条件为真,那么断言不起作用,如果为假,会终止程序。