C语言 日常小结

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

#include<stdio.h>
#include<stdlib.h>

void sort(int a[]){
    int num = sizeof(a);
    printf("数组的大小num=%d\n", 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=='\0'){
        *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("\n");
    //指针取值方式
    for (int i = 0; i < N; i++)
    {
        printf("%5d", *(p+i));
    }
    printf("\n");
    //总结:
    //*p是程序员手动的使用指针去完成间接取值(赋值)
    //[]是c/c++编译器帮我们做了一个*p的操作
    system("pause");
}
View Code

 

posted on 2016-03-09 14:03  寒魔影  阅读(433)  评论(0编辑  收藏  举报

导航