一、c語言內存函數
1、memcpy函數是一個標準庫函數,用于內存復制。功能上是用來將一塊內存中的內容復制到另一塊內存中。用戶需要提供目標地址、源地址以及要復制的字節數。例如結構體之間的復制。
memcpy函數的原型是:void* memcpy(void* dest,const void* src,size_t num)這里dest是目標指針、src是源指針,num是要復制的字節數。需要注意的是:src指向的內容在復制過程中不會被修改,所以用const修飾。
注意事項:
- 調用memcpy前需確保源內存與目標內存區域無重疊,否則應使用?
memmove
- 目標緩沖區大小應足夠容納拷貝數據,防止發生緩沖區溢出
- 第三個參數表示拷貝的字節數,建議使用?
sizeof
?運算符進行計算 - 處理結構體或包含指針的數據時,需注意淺拷貝可能導致的問題
- 源指針和目標指針必須為有效指針,禁止傳入空指針
注:strcpy只針對字符串,memcpy不在乎內存中存放什么數據,
#include<stdio.h>
#include<string.h>
int main()
{char src[] = "hello";char dest[10] = { 0 };memcpy(dest, src, sizeof(src));printf("%s\n", dest);return 0;
}
2、memmove函數(可以處理不重疊的情況)
void* memmove(void* dest,const void* src,size_t num),用戶需要提供目標地址、源地址以及要復制的字節數。這里dest是目標指針、src是源指針,num是要復制的字節數。需要注意的是:src指向的內容在復制過程中不會被修改,所以用const修飾。
#include<stdio.h>
#include<string.h>
int main()
{char str[] = "abcdefgh";//源和目標重疊,將從下標2的位置開始,復制5個字符到下標為4的位置memmove(str + 4, str + 2, sizeof(str));printf("%s\n", str);return 0;
}
3、memset內存設置函數
void* memset( void* ptr ,int value,size_t num),value是設置的值,ptr指向被填充的內存塊,num是要修改的字節數。(將內存中的值以字節為單位設置成想要的內容;只能改字節,不能改元素)
int main()
{char str[] = "Hello,world";memset(str, '6', 5 * sizeof(char));printf("%s\n", str);return 0;
}
4、memcmp函數(內存比較)
int memcmp(const void* ptr1,const void* ptr2,size_t num),比較從ptr1和ptr2指針指向的位置開始向后的num個字節的內容,如果倆個內存的內容完全相同,函數返回0;若ptr1所指向的內存區域在字典序上小于ptr2所指向的內存區域,函數返回一個小于0的值;如果ptr1所指向的內存區域在字典序上大于ptr2所指向的內存區域,函數返回一個大于0的值。使用方法如下:
int main()
{char str1[] = "abcdefgz";char str2[] = "abcdefgj";int end=memcmp(str1, str2,8);printf("%d", end);return 0;
二、整型數據在內存中的存儲
1、對于整形數組是來說:數據存放是放在內存中其實存放的是二進制的補碼,在輸出時要將補碼換為原碼!
2、大小端儲存方式
(1)大端儲存方式:數據的低位字節內容保存在內存的高地址位,而數據的高位字節內容,保存在內存的低地址處。
(2)小端儲存方式:數據的低位字節內容保存在內存的低地址處,而數據的高位字節內容保存在內存的高地址處。
三、浮點數在內存中的存儲
任意一個二進制浮點數V可以表示成這種形式:V=(-1)^s*M*2^E,先將浮點數轉換成二進制;(-1)^s表示符號位,s=0,V為正數,當s=1時,V為負數,M表示有效數字,M是大于等于1小于2的,2^E表示指數位。
先將浮點數轉換為二進制。
對于32位的浮點數·(float),最高的1位存儲符號位S,接著的8位存儲指數E,剩下的23位存儲有效數字M。
對于double類型的浮點數內存分配(8字節,64比特),存儲方式符下:
在保存時M可以寫成1.xxxxx的形式,其xxxxx表示小數部分。IEEE754規定在計算機內部保存M時,默認這個數第一位總是1,因此可以被消去。只保留1后的xxxxx部分就可以了,eg.1.01保存時只需要保存01,等讀取時再把第一位加上,這樣做是節省一位有效數字。
E是無符號整數,E為8位,它的取值范圍是0-->255;如果E為11位,它的值為0-->2047.
科學計數法中E可以為負數,所以IEEE754規定,存入內存時E的真實值必須再加一個中間數,對于8為E,這個數是127;對于E是11位時,這個中間數是1023。
比如:2^10的E是10,所以保存為32位浮點數時,必須保存成10+127=137
即:10001001
E真實值+127/1023=E的存儲值
浮點數取的過程中:
(1)E不全為0或者不全為1(常規情況)
0.5的二進制形式是0.1,規定有效數字部分必須為1,就是1.0*2^(-1),其階碼為-1+127=126(表示為:01111110),而尾數1.0去掉整部分后為0,補齊0到23位。如下圖:以float儲存為例:
(2)E全為0,此時浮點數的指數E(真實值)=1-127/1023,有效數字M不再加上第一位的1,而是還原為0.xxxxx的小數,這是表示正負0,以及接近0的很小的數字。
(3)E全為1,如果有效數字M全為0,表示正負無窮大。(正負取決于符號位S)
注:IEEE754是浮點數表示的標準
如有不足之處,請大家指出,謝謝!!!