C/C++指针、数组与内存管理(二)

 上一篇讲了指针与数组的一些区别,这篇将只讲解指针。计算机在存储数据时必须跟踪的3种基本属性

(1)信息存储在何处

(2)存储的值为多少

(3)存储的信息是什么类型

比如

int a = 0;

信息存储的地方:&a饿

存储的值: 0

存储的信息类型: int

这是一种比较简单的方法,定义一个简单的变量。声明语句指出了值得类型和符号名,还让程序分配内存,并在内部跟踪该存储单元。

在c/c++中,还可以声明指针变量存储数据。指针是一个变量,其存储的是值的地址,而不是值本身。

如何声明一个指针?

#include <stdio.h>

int main()
{
    int a = 10;
    int *point;    //指针声明
    point = &a;    //指针赋值
    printf("a = %d, &a = %d, *point = %d\n", a, point, *point)
    return 0;
}

对于指针,指针名表示的是地址,*运算符被称为间接值或解除引用运算符,将其应用于指针可以得到该地址存储的值。一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。

给指针初始化一个地址的方法:

int *ptr;

ptr = (int *)0xB8000000

指针真正的用武之地在于,在运行阶段分配未命名的内存,并使用指针来访问这个值。C/C++中可以用malloc/new分配内存,并返回其地址;用free/delete释放内存。分配与释放内存的例子如下:

int *p = new int;

delete p;

p = NULL;

或者

int *p = (int *)malloc(sizeof(int));

free p;

p = NULL

在内存分配成功后,就可以通过指针名访问这段内存。

另外需要指出的是,new/malloc分配的内存块通常与常规变量声明分配的内存块不同。常规变量的值都被存储在称为栈的内存区域中,而new从被称为堆(heap)或自由存储区的内存区域分配内存。

对于new/malloc,在c语言中只能用malloc,在c++中更推荐用new。对于使用delete来释放内存时,应遵守如下规则

(1)不要使用delete释放不是new分配的内存

(2)不要使用delete释放同一个内存两次

(3)如果使用new []为一个数组分配内存,则应使用delete[]来释放

(4)如果使用new []为一个实体分配内存,则应使用delete来释放

(5)对空指针应用delete是安全的

在c++中为数组分配动态内存的通用格式如下:

type_name *point_name = new type_name[num_elements]

下面看一个例子加深对指针的理解:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a = 10;
    int *point;                        //指针声明
    point = &a;                        //指针赋值
    int *ptr;                   //指针声明,使用&(引用)运算符将变量a的地址赋给point,point指向a
    ptr = (int *)malloc(sizeof(int));    //使用malloc分配内存
    *ptr = *point;              //*解除引用运算符,对指针解除引用意味着获得指针指向的值、
    printf("a = %d, &a = %d, *point = %d, *ptr = %d\n", a, point, *point, *ptr);
    free(ptr);        //虽然有两个指针,但只有ptr使用malloc分配的,所以只用free释放ptr
    ptr = NULL;     //将指针指向NULL,避免产生野指针    
    return 0;
}

运行后发现*ptr = *point = a = 10

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值