C提高1

以下內容爲本人看“傳智播客”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;
//*號放在右邊,取內存的值,讀內容

發佈了25 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章