*書寫定義宏用大寫
*數組名是常量,代表數組的地址,存儲數組的地址
*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