C語言中的知識點

1.寄存器、內存和CPU的關係

數據從內存中取出來,然後放到寄存器中,CPU再從寄存器中取出數據進行處理,處理完成後再將數據放回到寄存器中,然後再從寄存器回到內存中。CPU從不跟內存直接打交道。因爲寄存器的存取速度比內存要快得多,所以,先通過寄存器,然後再於內存進行數據交換;這樣就意味着,register變量必須是一個單個的值,並且其長度應小於或等於整型的長度;而且,register變量可能不存放在內存中,所以不能用取址運算符"&"來獲取register變量的地址

2.static 關鍵字的作用

2.1 修飾變量:無論是全局變量還是局部變量,被static修飾後,其都存儲在內存的靜態區

2.1.1:修飾全局變量

靜態全局變量,作用域僅限於變量被定義的文件中,

2.1.2:修飾局部變量

在函數體內定義,只能在該函數體內使用。被static修飾的變量總是存在內存的靜態區,所以即使當前函數運行結束,這個靜態變量的值還是不會被銷燬,函數下次使用時,仍然能用到這個值

2.2 修飾函數

該函數爲靜態函數,作用域侷限於本文件,不能被該文件外的其他函數調用;

好處:不用擔心自己定義的函數,是否與其他文件中的函數同名

3. 數據在內存中的存儲

數據一律以補碼的形式存儲;主要是因爲使用補碼,可以將符號位和其他位統一處理;同時,減法也可按加法來處理。兩個用補碼錶示的數相加時,如果最高位(符號位)有進位,則進位被捨棄。正數的補碼與其原碼一致;負數的補碼: 符號位不變,然後取其絕對值,再按位取反,最後加1,便得出其在內存中的存儲數值。

4. union 大小端對它的影響

union 

{

int i; 

char  a[2];

}*p, u;

p = &u;

p->a[0] = 0x39;

p->a[1] = 0x38;


p.i 的值應該爲多少呢?
這裏需要考慮存儲模式:大端模式和小端模式
大端模式(Big_endian):字數據的高字節存儲在低地址中,而字數據的低字節則存放在高地址中。 p.i = 0x3938;
小端模式(Little_endian):字數據的高字節存儲在高地址中,而字數據的低字節則存放在低地址中。 p.i = 0x3839;

union 型數據所佔的空間等於其最大的成員所佔的空間。對union 型的成員的存取都是相對於該聯合體基地址的偏移量爲0 處開始,也就是聯合體的訪問不論對哪個變量的存取都是從union 的首地址位置開始

使用這個方法,也可以用來檢測,當前控制器的存儲模式

下面這段程序輸出什麼

#include <stdio.h>
intmain()
{
int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}

&a + 1:這裏+1偏移的是一個sizeof(a)的大小,所以ptr1[-1] = 5;

(int)a + 1: 獲得的是a[1]元素的數據,所以*ptr2 = 2;

5. enum枚舉

枚舉是一種數據類型,且是int型,所以使用sizeof求一個枚舉變量所佔的內存空間大小,其值爲4

#define和enum

1)#define宏常量是在預編譯階段進行簡單替換。枚舉常量則是在編譯的時候確定其值

2)枚舉是一種數據類型,而#define不是


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