zoukankan      html  css  js  c++  java
  • C语言基础10

    栈区间:在函数内部声明的变量都存放在栈区间,比如int char 数组 结构体 指针,只管申请,系统会自动帮我们回收,收回的时间是作用域结束之后,遵循的原则是"先进后出"。

    int a = 10;

    const int m =10;

    printf("%p ", &m);

    printf("%p ", &a);

    堆区间:在五大区间中占用比例较大的区间,需要手动申请和手动释放,遵循的原则 "先进先出",堆区间空间的开辟是无序的,并且没有名字,所以我们需要一个栈区的指针来指向堆内存的数值。

    int *b = malloc(sizeof(int ) *2);

    printf("%p ",b);

    free(b);

    静态区:定义在函数体外面的变量。存放全局变量或者静态变量,生命周期很长,一般到程序结束才释放,使用static修饰的变量,只初始化一次,默认值为0

    static int c= 23;

    printf("%p ", &c);

    void test3( ){

      static int a =10; 第一次调用函数就赋初值,后面在调用函数这个语句就不会在允许。

      a++;

      printf("%d ",a);    //输出10,11,12

    }

     test3( );

     test3( );

     test3( );

    常量区:我们平时遇到的常量都放到这里比如"myname",'c',87,87.4

    printf("%p ",&"hello world ");

    常量区变量不能被修改

    char  *str ="iphone";    //字符指针指向常量区中字符串。

    char str1[] ="iphone";    // 将常量区字符串拷贝到栈区的指针名称为str1的空间中。

    str1[0] = 'I';        // 可以修改,不报错

    str[0] = 'I';        //不报错,但是不能编译成功.程序崩溃

    所以我们一般这样写:const char *str ="...." 这样写的好处就是在很大的项目中,我们在修改常量区变量的值的时候会报错,可以立即处理,而不是在编译运行之后报错,才从几万行代码中查找错误的源头。

    代码区:一将源码编译成二进制文件,一般是函数。

    void func( );

    void func( ){

      printf(...)'  

    }

    printf("%p " , func );  //传入函数名称。

    分配内存空间函数:

    malloc 最后释放的时候不是真正的"清空",而是标记该空间已经使用完成,里面存放的值可能还存在。

    char *str = malloc( sizeof(char) *30 );

    printf("%p ",str);

    free(str);

    free(str);  //不能重复的释放,会崩溃,因为已经没有对应指针名称的空间给你释放,为了安全起见,我们常常在free后面添加。

    str = NULL;

    calloc 开辟内存空间同时将里面的值清零。如果数据很大的话,效率很低。

    char *str1 = calloc( sizeof(char) , 30);

    printf("%p ",str1);

    free(str1);

    str1 =NULL;

    malloc与calloc两个分配内存空间的函数区别:

    malloc是堆中分配1块长度为size的连续区域,返回它的首地址.

    calloc 是堆中分配N块长度为size的联系区域,返回首地址.

    realloc  根据给定的内存地址,重新开辟空间,一般都是开辟更大的空间。

    int *num1 = malloc(sizeof(int ) * 10 );

    realloc(num1,40);  //将10个字节的空间扩大到40个字节。

    free(num1);

    num1 = NULL;

    memset 为刚开辟的空间赋初始值。

    char  *str3 = malloc(sizeof(char) * 20);

    memset(str3,'m',20);

    free(str3);

    str3 = NULL;

    memcpy 拷贝

    char *str4 = malloc(sizeof(char) *20);

    memcpy(str4,"luoshuailuo",6);  // 将luoshuailuo这个字符串拷贝到str4中,只拷贝6个字符。

    free(str4);

    str4 = NULL;

    memcmp 比较q

    char *name = malloc(sizeof(char) *100);

    char *name1 = malloc(sizeof(char) *100 );

    strcpy(name, "LUOSHUAI");

    strcpy("name1", "luoshuai");

    memcmp(name, name1, 100);

    free(name);

    free(name1);

    name = NULL;

    name1 = NULL;

    有一个字符串,里面包含字符和数字,要求提取数字,并动态分配内存保存。

    int *str ="iphone6and8Plus23cc84";

    int count = 0;

    for(int i = 0; i< strlen(str);i++ ){

      if(*(str+i) >= '0'  && *(str+i) <= '9'){

        count++;

      }

    }

    int *num =malloc(sizeof(int) * count );

    int count = 0;

    for(int i = 0; i< strlen(str);i++ ){

      if(*(str+i) >= '0'  && *(str+i) <= '9'){

          *(num+count) =  *(str+i) - 48;  //字符转化为数字 需要减少48

           count++;

      }

    }

    for(int i = 0 ; i < count; i++){

      printf("%d ", *(num+i ));

    }

    free(num);

    num = NULL;

    自我学习积累篇:

    strncpy(destion,source, num ); 该函数的作用是将"source"的第num个长度字符串拷贝到"destion",

    如果num < source的长度,则会讲source的前面的num个字符串拷贝到source,不会添加

    如果num = source的长度,则会将source所有字符拷贝到source,不会添加

    如果num > source的长度,则会将source所有字符拷贝到source,后面会持续添加, 少多个个就添加多少个.

  • 相关阅读:
    Ubuntu挂起后无法唤醒的问题以及解决方式
    两个比较给力的开源框架(1.头像选择,拍照,裁剪 2.自定义对话框)
    把APP演示做成GIF图
    单点触控与多点触控
    自定义imageView圆形图片
    自定义imageView圆形
    xmlBean类
    解析xml并展示数据(fragment)
    解析xml并展示数据(mainActivity)
    XStream解析xml代码
  • 原文地址:https://www.cnblogs.com/liruoxuan/p/4086972.html
Copyright © 2011-2022 走看看