Linux C 第五课

来源:互联网 发布:mac新建的文件夹在哪看 编辑:程序博客网 时间:2024/05/16 14:57

*书写定义宏用大写
*数组名是常量,代表数组的地址,存储数组的地址
*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

#include<stdio.h>#define MAX_SIZE 1024int 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

#include<stdio.h>#define MAX_SIZE 1024char * 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

#include<stdio.h>#define MAX_SIZE 1024char * 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

#include<stdio.h>#define MAX_SIZE 1024int 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.所需头文件

#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

0 0
原创粉丝点击