為什麼有資料型別?
現實生活中的資料太多而且大小形態不一。
資料型別與記憶體的關係:
資料型別的本質:建立變數的模具,是固定大小的別名。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main()
問題:b,&b所代表的資料型別不一樣:
b代表的是陣列首元素的位址,&b代表的是整個陣列的位址。&b+1,相當於給整個陣列加了1個陣列大小的位址。
重點:(陣列資料型別:1.定義;2.陣列指標;3.陣列型別和陣列指標型別的關係)
陣列的大小:
printf("sizeof(b):%d",sizeof(b));//40
printf("sizeof(a):%d",sizeof(a));//4
資料型別的作用:編譯器預算物件分配的記憶體空間大小。
資料型別的別名:typedef
struct teacher
main:
struct teacher t1;//沒有struct關鍵字會報錯
t1.age = 3;
自定義資料型別:typedef
typedef struct teacherteacher;
main:
struct teacher t1;//沒有struct關鍵字不會報錯
t1.age = 31;
c語言中會報錯,c++中增強了struct關鍵字。會沒有問題。
1.void"無型別",void*"無型別指標",可以指向任何型別的資料。
2.用法:
1.資料型別的封裝3.void指標的含義:int inithardenv(void **handle);
典型的如記憶體操作函式memcpy和memset的函式原型分別為 void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
2.void修飾函式返回值和引數,僅表示無。
如果函式沒有返回值,那麼應該將其宣告為void型
如果函式沒有引數,應該宣告其引數為void
int function(void)
c語言規定只有相同型別的指標才可以相互賦值
void指標作為左值用於「接收」任意型別的指標
void指標作為右值賦值給其它指標時需要強制型別轉換
int *p1 = null;
char *p2 = (char *)malloc(sizoeof(char)*20);
變數概念:即能讀又能寫的記憶體物件,若一旦初始化不能修改的物件是常量。
變數的本質:
1.程式通過變數名來申請和命名空間2.通過變數名訪問記憶體空間(一段連續)記憶體空間的別名(猶如門牌號)
3.修改變數的方法:
1.直接(賦值法)eg:int a = 78;
2.間接。記憶體有位址編號,通過位址編號可以修改記憶體;
int a;
int b;
int *p;
a = 10;//直接修改
printf("&a:%d\n",&a);//獲取到a的位址1245024
//間接修改====直接通過記憶體修改
*((int*)1245024) = 200;//int* 表示型別,*()代表作指標
printf("a:%d\n",a);//200
printf("a:%d\n",a);//300
4.對記憶體空間能取別名.....總結:5.資料型別和變數的關係:通過資料型別定義變數
1.對記憶體,可讀可寫;思考1:變數三要素(名稱、大小、作用域),變數的生命週期?2.通過變數往記憶體讀寫資料;
3.不是向變數讀寫資料,而是向變數所代表的記憶體空間中寫資料。(變數跑哪去了?變數有變數的儲存空間);
思考2:c++編譯器是如何管理函式1,函式2變數之間的關係的?
記憶體四區的流程:
硬碟(程式)>>記憶體(**,作業系統**)
=>>執行過程中,c程式記憶體管理(堆區,棧區,全域性區,**區)
流程說明:
1.作業系統把物理硬碟**load到記憶體各區元素分析:2.作業系統把c**分成四個區
3.作業系統找到main函式入口執行
1.棧區(stack):由編譯系統自動分配釋放,存放函式的引數值,區域性變數的值等。
2.堆區(heap):一般由程式設計師分配釋放(動態記憶體申請與釋放)如程式設計師不釋放,程式結束時可能作業系統**。
3.全域性區(靜態區)(static):如果儲存的值一樣,c++編譯器會自動保留乙份。
1.全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域,該區域在程式結束後有作業系統釋放。4.程式**區:存放函式的二進位制**。2.常量區:字串常量和其他常量的儲存位置,程式結束後有作業系統釋放。
C語言的深入 記憶體對齊的概念
1 記憶體對齊的概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。2 記憶體對齊的意義 需要記憶體對齊的根本原因在於cpu訪問資料的效率問題。從某種意義上講...
深入記憶體模型和函式呼叫機制,理解析構函式的執行順序
為什麼析構函式的執行順序是相反的。要搞清楚這個問題,首先要明白c 記憶體模型,也就是c 的 和資料在記憶體中是如何儲存的。c 記憶體模型和c語言類似 有部分細節不同 你可以參照c語言記憶體模型來理解。在記憶體模型中有一塊區域叫做棧區,它是由系統維護的 程式設計師無法操作 用來儲存函式的引數 區域性變...
更新的深入內容
有三個操作可改變表的狀態 插入乙個新行 刪除乙個現有的行 更新乙個現有的行 對於其中的每乙個關鍵操作,資料介面卡都會定義乙個作為屬性公開的自定義的命令物件。這樣的屬性包括insertcommand deletecommand和updatecommand。程式設計師負責為這些屬性分配有意義的命令物件,...