C++指针——指针(指针、指针与数组、指针与结构、指针与函数)的含义及赋值

C++指针——指针(指针、指针与数组、指针与结构、指针与函数)的含义及赋值

指针定义

    指针实际上就是地址,指针变量用来存放指针(地址)。
    指针变量也是一种变量,它和不同的变量同样要占一定的存储空间。但指针变量与不同的变量不同之处在于,指针的存储空间存放的不是不同的数据,而是一个地址。
    因此,在我们写程序时使用指针时,为了不让自己混淆,请习惯性将定义指针称为定义指针变量。
    指针变量可以操作多种数据结果,使用指针可以操作数组和字符串,可进行函数调用,还可以处理内存地址。

指针与变量

    数据在内存中是如何存放的?在机器中,内存是由一个个内存单元构成的,每个内存单元包含8位二进制位,也就是一个字节。每个内存单元有一个唯一的编号,这个编号称为内存单元地址。而内存单元地址在书写时通常使用16进制来表示,在本质上还是2进制数,只是为了方便书写。
    假设i是一个占两个字节的整型变量,而p是一个指向变量i的指针。如下图所示:
在这里插入图片描述
    变量i的地址范围为2000H~2001H,i的数值为1010010001001011。指针变量p也占两个内存单元,地址范围为2100H—2101H,数值为0010000000000000。
    指针变量p有自己的内存地址2100H(取首地址为代表地址),而变量p的值却是0010000000000000,那么这个值等于多少呢?换算成16进制,发现,这个值为2000H,正是变量i的地址(取首地址为代表地址)。这样子,我们就将指针变量p和整型变量i连接起来了,通过p就可以找到i,当然先获得的是i的地址, 其次是i对应的内存单元。

动态内存分配

    什么叫动态内存分配?我们知道局部变量一般是存放在程序的堆栈里面的。每个程序都有一个堆栈区。计算机操作系统里,除了堆栈区,还有堆存储区。堆存储区就是所有程序共享的这块内存。也即所有程序共享的且空闲的内存。如果我们要想向操作系统里面的堆存储区的空闲内存申请一块内存,在C语言里,我们用malloc函数。但在C++中,建议使用new代替malloc。因为new除了分配内存,还会给对象做一定的初始化。特别是如果申请一个类对象的时候,可能需要调用类的构造函数。我们这里先new一个int类型的内存块,举例:

int *p = new int; //通过new一个int型内存块,就会向操作系统申请int大小的这样一块内存,如果成功了,把它的值赋值给int型的指针变量p,此时p的值是非0的,如果不成功p的值就是0(通常情况下都会成功,只要计算机内存足够多)

*p = 3; //将刚才申请的那块内存中的值设置为3。因为上一句已经分配给它一个内存了(new的)。虽然它没有名字(这块内存是没名字的),我们没有通过名字去访问这块内存,但这块内存的地址存放在指针变量p里面,我们可以通过指针变量p去访问到这块内存。也就是说我们new申请了一块内存,虽然这块内存没有名字,但它的地址保存在我们程序定义的局部堆栈中的一个局部变量p里面,p这块内存是堆栈区的一块内存,就是我们程序函数的局部变量,而指向的地址是堆存储区的一块内存。

cout << p << ‘\t’ << *p << endl; //输出p的值(地址),还有*p(即内存块的内容)。

delete p; //动态分配的内存实际上是向操作系统申请的,我们如果使用完了,应该养成一个好的习惯,把它再释放掉。如果不释放掉,那么这块内存始终被你占用,易造成内存泄露。

上面的例子是用指针指向一块int型数据的内存,也可以指向多个int型的内存块,如数组。举例:

*int p = new int[5]; //这个内存空间可以存放5个int型的数值,把它(这块内存)的地址放到p里面。这里的p实际上是指向5个int型数据中的第1个int数据的地址。

但是,此时释放内存是这样的:

delete[] p; //因为delete p只释放了一个,后面三个未释放,这里需要加上[]

总结:new用于申请内存块,delete用于释放内存块。

指针与数组

声明一个数组:int a[10];
声明一个指针:int *p;
对指针p做初始化:

p=&a[0]; // 对指针进行初始化,p将指向数组 a 的第 1 个元素 a[0]

    我们知道,对指针进行自增操作会让指针指向与当前元素相邻的下一个元素,即 *(p + 1) 将指向 a[1] ;同样的, *(p + i) 将指向 a[i] 。因此,我们可以使用该指针来遍历数组 a[10] 的所有元素。可以看到,数组下标与指针运算之间的关系是一一对应的。而根据定义,数组类型的变量或表达式的值是该数组第 1 个元素的地址,且数组名所代表的的就是该数组第 1 个元素的地址,故,上述赋值语句可以直接写成:

p = a;        // a 为数组名,代表该数组最开始的一个元素的地址 

    很显然,一个通过数组和下标实现的表达式可以等价地通过指针及其偏移量来实现,这就是数组和指针的互通之处。但有一点要明确的是,数组和指针并不是完全等价,指针是一个变量,而数组名不是变量,它数组中第 1 个元素的地址,数组可以看做是一个用于保存变量的容器。

指针与结构、指针与函数

详细链接:C语言——指针详解(指针、指针与数组、指针与结构、指针与函数)

转载链接

c语言与指针——(一)指针与变量
c语言与指针——(二)指针变量的定义与赋值
快乐C++编程——动态内存分配
C语言——指针详解(指针、指针与数组、指针与结构、指针与函数)
指针,C语言指针完全攻略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值