1. 内存和地址的定义
1.1内存
计算机把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节(1 byte)。其中,每个内存单元,相当于我们的学⽣宿舍,⼀个⼈字节空间⾥⾯能放8个⽐特位,就好⽐我们住的宿舍是⼋⼈间,每个⼈是⼀个⽐特位(bit)。
1.2地址
每个内存单元都有⼀个编号,这个编号就相当于我们宿舍房间的⻔牌号。有了门牌号,辅导员就可以快速查到我们寝室来检查卫生,而计算机有了这个内存单元的编号,CPU就可以快速找到⼀个内存空间。\n⽣活中我们把⻔牌号叫地址,在计算机中我们把内存单元的编号也称为地址。
C语⾔中给地址起了新的名字叫:指针。
所以:内存单元的编号 == 地址 == 指针
2.指针和地址
2.1取地址符号为&
#include<iostream>
using namespace std;
int main() {
char a = 10;
/*cout << (&a) << endl;*/
printf("%#X", &a); // 地址-> 0XD53EFAB4
return 0;
}
3.指针的定义
3.1指针变量
#include<iostream>
using namespace std;
int main() {
int a = 10, b = 20;
//1.指针变量的定义
// int *pa;
int* pa;
pa = &a; //pa 存贮a的地址
printf("%#X %#X\n", &a, &b);
printf("%#X\n", pa);
cout << a << ' ' << (*pa) << endl;
3.2解引号
//2. 解引用
// *pa = 7;
*pa = 7; //找到pa指向的对象a,并改为a = 7, 等价于 a=7;
cout << a<<' '<< (*pa) << endl;
cout << "------" << endl;
3.3&和*的关系
//3.*和&
/**&a = *(&a) = *pa = a;*/
/*&*pa = &(*pa) = &a = pa;*/
cout << (*&a) << endl;
cout << (*(&a)) << endl;
cout << (*pa) << endl;
cout << (a) << endl;
cout << "------" << endl;
cout << (&*pa) << endl;
cout << (&(*pa)) << endl;
cout << (&a) << endl;
cout << (pa) << endl;
return 0;
}
4.指针的内存空间
各种各指针类型字节大小都一样,都是占8个字节。
#include<iostream>
using namespace std;
int main() {
//各指针类型字节大小都一样
cout << sizeof(int*) << endl;
cout << sizeof(short*) << endl;
cout << sizeof(char*) << endl;
cout << sizeof(float*) << endl;
cout << sizeof(double*) << endl;
cout << sizeof(long*) << endl;
cout << sizeof(long long*) << endl;
return 0;
}
5空指针与野指针
5.1空指针
*NULL是一个值为0的宏常量:#define NULL ((void )0)
意义:为了标志指针变量没有指向任何变量(空闲可用),在C语言中,通常把NULL赋值给此指针,这样就标志此指针为空指针,没有指向任何空间。
注意:对指针解引用操作可以获得它所指向的值。但从定义上看,NULL指针并未指向任何东西,因为对一个NULL指针解引用是一个非法的操作,所以在解引用之前,必须确保它不是一个NULL指针。
5.2野指针及预防
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
导致野指针的原因 | 解决
1.指针未初始化 |||| 指针初始化
指针越界访问 |||| 注意界限
指针指向的空间释放 | 用完及时置NULL
#include<iostream>
using namespace std;
int main() {
//1.空指针
int* p = NULL;
cout << (*p) << endl;
//2.野指针
int* pa = (int *)0x121412;
cout << (*pa) << endl;
return 0;
}