zoukankan      html  css  js  c++  java
  • C语言 日常小结

    1.当数组当作函数参数的时候会退化为指针

    #include<stdio.h>
    #include<stdlib.h>
    
    void sort(int a[]){
        int num = sizeof(a);
        printf("数组的大小num=%d
    ", num);//打印4,此时a是一个指针
        //打印数组
        for (int i = 0; i < 10; i++)
        {
            printf("%5d", a[i]);
        }
    }
    
    void main(){
        int a[10] = {4,3,8,5,1,7,2,9,0,6};
        sort(a);
        system("pause");
    }
    View Code

    2.数据类型的本质上是固定内存大小的别名,数据类型的作用是编译器预算对象(变量)分配的内存空间大小

    //数据类型的本质
    #include<stdio.h>
    #include<stdlib.h>
    
    void main(){
        int b = 5;//int数据类型表示:创建int型的变量需要在内存中分配4个字节大小的空间
        int a[10] = {4,3,8,5,1,7,2,9,0,6};//int []数据类型表示:创建一个int型数组需要在内存中分配sizeof(int)*10=40个字节大小的空间
        char ch = 'a';//char数据类型表示:创建char型的变量需要在内存中分配1个字节大小的空间
        float fdata = 1.0;//float数据类型表示:创建float型的变量需要在内存中分配4个字节大小的空间
        short sdata = 1;//short数据类型表示:创建short型的变量需要在内存中分配2个字节大小的空间
        double dd = 1.0;//double数据类型表示:创建double型的变量需要在内存中分配8个字节大小的空间
        char *p = NULL;//char *数据类型表示:创建char *型的指针变量需要在内存中分配4个字节大小的空间,
        //所以指针类型变量都是分配4个字节大小的内存空间
        //结构体,共用体则需要根据各自的特性去计算分配内存空间
    }
    View Code

    3.字符串常量因为c++编译器的优化,相同的字符串常量只会在代码去创建一个变量

    4.头文件string.h下的strcpy()函数的本质,是将原来字符串str复制到新指针p所指向的内存空间,而不是将原来字符串str的地址赋值给新指针p,因此新指针p必须满足有对应的内存空间(即指针p必须有值)

    #define  _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    
    void main(){
        char *p = NULL;
        char *p1 = NULL;
        strcpy(p, "asadf");//会报错  指针p是空指针,没有对应的内存空间,所以*p会直接读取0x000000的地址,而0x000000是系统专用
        //strcpy()的本质
        /*while (p==''){
            *p = *p1;
            p++;
            p1++;
        }*/
        system("pause");
    }
    View Code

    5.对于动态分配的内存而言,并不支持单个内存单元的释放,只能释放整个动态内存

    //动态分配内存的释放
    
    #include<stdio.h>
    #include<stdlib.h>
    
    //定义数组大小
    #define N 10
    
    
    void main(){
        //创建int类型数组
        int *p = (int *)malloc(sizeof(int)*N);
        for (int i = 0; i < 10; i++)
        {
            *(p + i) = i + 5;
        }
        for (int i = 0; i < 10; i++)
        {
            printf("%5d", p[i]);
        }
        //对于动态分配的内存而言,并不支持单个内存单元的释放,只能释放整个动态内存
        //例如 
        //free(p+1);   程序报错
        //释放动态内存,只能释放头指针
        free(p);
        //避免野指针,必须将P赋值NULL
        p = NULL;
    
        system("pause");
    }
    View Code

    6.数组[]的本质是c/c++编译器帮我们做了一个*p的操作

    //数组[]的本质
    
    #include<stdio.h>
    #include<stdlib.h>
    
    //定义数组大小
    #define N 10
    
    
    void main(){
        //定义数组
        int arr[N] = { 1,2,3,4,5,6,7,8,9 };
        //定义数组指针
        int *p = arr;
        //[]取值方式
        for (int i = 0; i < N; i++)
        {
            printf("%5d",arr[i]);
            //arr是一个指针;arr[i]===>arr[0+i]===>*(arr+i)
        }
        printf("
    ");
        //指针取值方式
        for (int i = 0; i < N; i++)
        {
            printf("%5d", *(p+i));
        }
        printf("
    ");
        //总结:
        //*p是程序员手动的使用指针去完成间接取值(赋值)
        //[]是c/c++编译器帮我们做了一个*p的操作
        system("pause");
    }
    View Code
  • 相关阅读:
    文本框的正则表达式验证
    八皇后问题 回溯法
    Repeater中使用倒计时
    c#导入excel 绑定数据 repeat为例子
    "table" is not mapped 解决方法
    NHibernate的常见问题及解决方案
    Nginx日志切割,跨域配置,防盗链配置
    springboot跨域配置
    图片上传,文件url地址添加时间戳,防止浏览器缓存的情况
    使用Hibernate数据验证
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5257939.html
Copyright © 2011-2022 走看看