上一篇讲了指针与数组的一些区别,这篇将只讲解指针。计算机在存储数据时必须跟踪的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