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

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章