以下內容爲本人看“傳智播客”C++基礎教程完整版視頻所做的筆記
程序的內存四區模型
棧區(stack):程序局部變量,系統給分配空間,函數結束後空間自動給回收,在函數裏面寫的變量都在棧區
堆區(heap):程序員手動分配空間 malloc/new free/delete
全局區:全局變量,靜態變量,文字常量區
代碼區:操作系統管理
例子:
#include "stdafx.h"
char *get_str1()
{
char *p = "abcdef";//"abcdef放在全局區中的文字常量區
return p;
}
char *get_str2()
{
char *q = "ghijkl";//"ghijkl放在全局區中的文字常量區
return q;
}
char *get_str3()
{
char *k = "abcdef";//"abcdef放在全局區中的文字常量區
return k;
}
int main()
{
char *p = NULL;
char *q = NULL;
char *k = NULL;
p = get_str1();
q = get_str2();
k = get_str3();
//%s:指針指向內存區的內容
//%d:指針P本身的值
printf("p=%s,p=%d\n",p,p);
printf("k=%s,k=%d\n", k,k);
printf("q=%s,q=%d", q, q);
printf("\n");
system("pause");
return 0;
}
編譯結果如下:
- 注:因爲在函數get_str1()和get_str3()中指針p和k都指向的內存全局區中"abcdef",所以p和k的值(即常量"abcdef"的地址)是一樣的。
棧區分析
注意函數體中的局部變量系統將其放在內存的棧區,所以函數調用結束後內存將釋放。比如調用完語句:(如下)
p = get_str(); //get_str()返回的是數組變量str[]
結束後,str[]中的值將被釋放,那麼指針p所指向的str[]中的數將爲亂碼如果此時調用語句:
printf("p = %S\n",p);
則調試結果如下:
堆區分析
用動態分配內存空間函數malloc()
如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。
使用方法如下代碼,這樣就不會造成調用完函數內存空間就被釋放的結。
#include "stdafx.h"
#pragma warning(disable:4996) //用strcpy()時須用此條語句
char *get_str()
{
char *temp = (char *)malloc(100);
if (temp == NULL)
{
return NULL;
}
const char a[] = "ahsfdh";
strcpy(temp, a);
return temp;
}
void main()
{
char *p = NULL;
p = get_str();
if (p != NULL)
{
printf("p = %s\n", p);
free(p);
p = NULL;//因爲free(p)的作用只是將指針p指向堆區的關係釋放出來,
//以允許其他指針可以指向堆區,但指針p此時仍指向堆去,所以要將p的值賦爲空
}
system("pause");
}
測試結果如下:
指針是一種數據類型
數據類型的本質是固定內存大小快
32位的程序指針都是佔4個字節
指針變量也是變量,它可以保存數據如:
*p =0x11//指針變量*p的值爲0x11
通過*號操作內存
在函數中以下幾條語句說明了如何用*號操作內存
int a = 100;
int *p = NULL;
//指針指向誰,就把誰的地址賦值給指針
p = &a;
//*鑰匙,通過*可以找到指針指向的內存區域,操作還是內存
*p = 22;
//*號放在左邊,給內存賦值,寫內容
int b = *p;
//*號放在右邊,取內存的值,讀內容