上一篇講了指針與數組的一些區別,這篇將只講解指針。計算機在存儲數據時必須跟蹤的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