C/C++的指针1

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;
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值