*書寫定義宏用大寫
*數組名是常量,代表數組的地址,存儲數組的地址
*if(6 == num) // 使用 == 是將常數寫在等號左邊
{
…
}
*if(),while(),for() 括號後面都不可以加 ;
*邏輯運算符
① && 短路與 當符號左邊為 0 時,結果為0,後面的不計算
② ||短路非 當符號左邊為1時,結果為1,後面的不計算
③ !非
*常量都是有符號數,有用強制轉換轉為無符號數(unsigned int)
*有符號數與無符號數預算轉換為有符號數
*位運算 要對無符號數進行操作
*位運算 要借助掩碼(unsigned int mask)
* &使用場合
①清零特定位,先寫掩碼,掩碼特定位為0,其他位為1
②取某數的特定位,先寫掩碼,掩碼特定位為1,其他位為0
*有符號數 >> 補符,<< 補零
無符號數 >> << 補零
* | 使用場合 特定位置1,先寫補碼,特定位為1,其他位為0
* ^ 異或 使用場合
①使特定位取反
②不使用中間變量交換兩數的值
*指針
☆對應的內存空間
☆指向的內存空間
num++;對num對應的內存空間裡面的值加1
p++;對p對應的內存空間裡面的值加1(一個步長)
*(p)++;根據p對應的內存空間裡的地址找到其對應的內存空間,
即對p指向的內存空間操作
*巨指針(遠指針):超過二維的指針
*
*野指針:隨機指向一塊內存的指針,
*野指針造成的錯誤:導致內存洩漏
*造成內存洩漏的原因:
①指向一塊沒有訪問權限的內存
②訪問一塊已經釋放的內存
*如何避免產生野指針
①聲明一個指針時要注意初始化,int * p = NULL;
②分配完內存以後要檢查指針是否不為空
③釋放內存空間後,要給指針賦值,p = NULL;
④不要在另外一個函數中釋放本函數的指針
⑤返回局部變量的地址時,最好使用靜態局部變量,以防止函數調用結束後,引發段錯誤
*字符串的名字就是首字符的地址
*盡量不要使用形參作為工作變量
*對字符串操作的函數
strlen,strcpy,strncpy,strcmp,strncmp,strcat,strncat
*my_strlen
[code]#include<stdio.h> #define MAX_SIZE 1024 int my_strlen(char *s) { int len = 0; while(*s != '\0') { len++; s++; } return len; } int main() { char str[MAX_SIZE]; int len; printf("please input a string:\n"); scanf("%s",str); len = my_strlen(str); printf("len = %d\n",len); return 0; }*my_strcpy my_strncpy
[code]#include<stdio.h> #define MAX_SIZE 1024 char * my_strcpy(char *dest,char *str) { char *tmp = dest; while(*str != '\0') { *tmp = *str; tmp++; str++; } tmp = '\0'; return dest; } char * my_strncpy(char *dest,char *str,int n) { int i; char *tmp = dest; for(i = 0;i < n;i++) { *tmp = *str; tmp++; str++; } tmp = '\0'; return dest; } int main() { char dest[MAX_SIZE]; char str[MAX_SIZE]; char *tmp; printf("please input a string:\n"); scanf("%s",str); tmp = my_strcpy(dest,str); printf("tmp = %s\n",tmp); printf("dest = %s\n",dest); tmp = my_strncpy(dest,str,5); printf("tmp = %s\n",tmp); printf("dest = %s\n",dest); return 0; }*my_strcat my_strncat
[code]#include<stdio.h> #define MAX_SIZE 1024 char * my_strcat(char *dest,char *str) { char *tmp = dest; while(*tmp != '\0') { tmp++; } while(*str != '\0') { *tmp = *str; str++; tmp++; } tmp = '\0'; return dest; } char * my_strncat(char* dest,char *str,int n) { char *tmp = dest; int i; while(*tmp != '\0') { tmp++; } for(i = 0;i < n;i++) { *tmp = *str; tmp++; str++; } *tmp = '\0'; return dest; } int main() { char dest[MAX_SIZE] = "abcdefg"; char str[MAX_SIZE]; char *tmp; printf("please input a string:\n"); scanf("%s",str); tmp = my_strcat(dest,str); printf("tmp = %s\n",tmp); printf("dest = %s\n",dest); tmp = my_strncat(dest,str,2); printf("tmp = %s\n",tmp); printf("dest = %s\n",dest); return 0; }*my_strcmp my_strncmp
[code]#include<stdio.h> #define MAX_SIZE 1024 int my_strcmp(char *dest,char *str) { while(*str != '\0' && *dest !='\0') { if(*dest > *str) { return 1; } if(*dest < *str) { return -1; } dest++; str++; } if(*str == '\0' && *dest != '\0') { return 1; } if(*str != '\0' && *dest == '\0') { return -1; } return 0; } int my_strncmp(char *str,char *p,int len) { int i; for(i = 0;i < len;i++) { if (*(str+i) != *(p + i)) { return 1; } } return 0; } int main() { char dest[MAX_SIZE] = "abcdefg"; char str[MAX_SIZE]; char *tmp; printf("please input a string:\n"); scanf("%s",str); int value = my_strcmp(dest,str); printf("vlaue = %d\n",value); return 0; }*memcpy
1.功能
memcpy是c和c++使用的內存拷貝函數,memcpy函數的功能是從源src所指的內存地址的起始位置開始拷貝n個字節到目標dest所指的內存地址的起始位置中
2.函數
void * memcpy(void *dest, const void *src, size_t n);//函數返回指向dest的指針。
3.注意事項
①source和destin所指的內存區域可能重疊,但是如果source和destin所指的內存區域重疊,那麼這個函數並不能夠確保source所在重疊區域在拷貝之前不被覆蓋。而使用memmove可以用來處理重疊區域。函數返回指向destin的指針.
②如果目標數組destin本身已有數據,執行memcpy()後,將覆蓋原有數據(最多覆蓋n)。如果要追加數據,則每次執行memcpy後,要將目標數組地址增加到你要追加數據的地址。
注意:source和destin都不一定是數組,任意的可讀寫的空間均可。
4.strcpy和memcpy主要有以下3方面的區別。
1、復制的內容不同。strcpy只能復制字符串,而memcpy可以復制任意內容,例如字符數組、整型、結構體、類等。
2、復制的方法不同。strcpy不需要指定長度,它遇到被復制字符的串結束符”\0”才結束,所以容易溢出。memcpy則是根據其第3個參數決定復制的長度。
3、用途不同。通常在復制字符串時用strcpy,而需要復制其他類型數據時則一般用memcpy
*memcmp
1.功能
memcmp是比較內存區域buf1和buf2的前count個字節。該函數是按字節比較的。
2.函數
int memcmp(const void *buf1, const void *buf2, unsigned int count);
3.所需頭文件
[code]#include <string.h>或#include<memory.h>4.返回值
當buf1 > buf2時,返回值<0
當buf1==buf2時,返回值=0
當buf1>buf2時,返回值>0
5.該函數是按字節比較的。
例如:
s1,s2為字符串時候memcmp(s1,s2,1)就是比較s1和s2的第一個字節的ascII碼值;
memcmp(s1,s2,n)就是比較s1和s2的前n個字節的ascII碼值;
如:char *s1=”abc”;
char *s2=”acd”;
int r=memcmp(s1,s2,3);
就是比較s1和s2的前3個字節,第一個字節相等,第二個字節比較中大小已經確定,不必繼續比較第三字節了。所以r=-1