结构体数组.   结构体指针->
//内存的五大分区: 栈区,堆区,静态去,常量区,代码区
//代码区:代码在编译后形成的二进制都放在代码区;
//常量区:放在常量区的常量是只读不可写的
    //    const int a = 5;//加了const关键字后就放在了常量区
    //    a = 6;//常量区的常量不能再次赋值
    //    const float b = 9;
    //    b = 8;
    //    char arr[] = "zhoujielun";
    //    arr[0] = 'Z';//此处是复制了常量区的字符串,所以可以改变
    //    char *arr1 = "zhoujielun";
    //    arr1[0] = 'Z';//用指针直接指向了常量区,并想通过指针修改字符串 常量区的常量不可以改变 导致系统程序崩溃
//静态区(全局区):
    //    static int a = 0;//这个变量经过static修饰放在了静态区
    //    静态区的变量只能初始化一次
    //    如果不给初始值 系统默认0
    //    程序退出才被释放
    //    放在花括号外面的变量 即 全局变量也是放在静态区的
//栈区:栈区里存放的是局部变量和函数参数
    //    特点:先进后出 从高到低分配 从低到高是使用 栈低栈顶
    //    int a = 5;
    //    int b = 6;
    //    int c = 7;
    //    printf("%p\n",&a);
    //    printf("%p\n",&b);
    //    printf("%p\n",&c);
    //    int arr[3] = {1,2,3};
    //    for (int i = 0; i < 3; i++) {
    //        printf("%p\n",&arr[i]);
    //    }
    //    通过指针 操作 返回栈内存是不安全的
    //    栈区的内存是系统自动分配和释放的 栈区的空间容量是特别小的
//堆区:是由程序员手动的分配和释放的 他的空间比较大
    //  char *arr = malloc(8);//malloc 堆区
    //    arr = "iphone";//7位 指针常量区
    //    free(arr);
    //  strcpy(arr, "iphone");
    //  printf("%s\n",arr);
    //  int *a = malloc(4);
    //  *a = 4;
    //  printf("%d\n",*a);
    //  free(a);//释放 内存都是标记删除的
    //  a = NULL;
//其他内存分配函数
    //calloc//自动清零
    //void *  = calloc(,);
//    int *p1 = calloc(10, 2);//第一个参数表示有几个,第二个参数表示每个站几个字节
//    for (int i = 0; i < 20; i++) {
//        * (p1 + i) = 2;
//        printf("%d",*(p1 + i));
//    }
//    printf("\n");
    //realloc
    //void *  = realloc(,);//第一个参数表示想重新分配的内存,第二个参数表示想重新分配的字节数
//    int *p2 = realloc(p1, 5);
//    for (int i = 0; i < 5; i++) {
//        *(p2 + i) = 2;
//        printf("%d",*(p2 + i));
//    }
//内存操作函数
    //初始化内存
    //memset 第一个参数是指针,第二个参数是设置内容(字符型的),第三个参数是几个字节
    int *p1 = malloc(8);
    int *p2 = memset(p1,107, 8);
    for (int i = 0; i < 8; i++) {
        printf("%c ",*(p2 + i));
    }
    //内存拷贝
    //memcpy 第一个参数是目的指针,第二个参数是源指针,第三个参数是分配几个字节
    char *p3 = malloc(5);
    p3 = memcpy(p3, p2, 5);
    for (int i = 0; i < 5; i++) {
        printf("%c",*(p3 + i));
    }
    //内存比较
    //memcmp 第一个参数是被减数,第二个参数是减数,第三个参数是比较几个字节 跟strcmp类似也是比较的ASCII码表的值
    char *p4 = malloc(8);
    char *p5 = malloc(8);
    memset(p4, 65, 8);
    memset(p5, 66, 8);
    int count = memcmp(p4, p5, 8);
    printf(" %d\n",count);
    int *a = malloc(3*sizeof(int));
    int *b = calloc(3,sizeof(int));
    memset(a, 0, 12);
    for (int i = 0; i < 3; i++) {
        *(a + i) = arc4random() % 4;
        *(b + i) = arc4random() % 4;
        printf("a=%d b=%d\n",*(a + i),*(b + i));
    }
    int count1 = memcmp(a, b, 12);
    if (count1 == 0) {
        printf("Good!");
    }
    else
        printf("Faided!");
 //练习:找出字符串中的数字 使用内存分配
   /* char arr[] = "a1b2c3d4";
//    int length = sizeof(arr)/sizeof(char);
//    for (int i = 0; i < length - 1 ; i++) {
//        if (arr[i] >= 48 && arr[i] <= 57) {
//            printf("%c ",arr[i]);
//        }
//    }
    int count = 0;
    char temp[100] = {0};
    for (int i = 0; i < strlen(arr); i++) {
        if (((*(arr + i)) >= '0') && (*(arr + i)) <= '9'){
            temp[count] = *(arr + i);
            count++;
           }
        }
        temp[count] = '\0';
        char *arr1 = malloc(sizeof(char) * (count + 1));
    strcpy(arr1, temp);
    printf("%s\n",arr1);
    free(arr1);
    arr1 = NULL;//释放
    //练习:输入3个姓名 保存输出 ,使用内存分配
    char *name[3] = {0};
    printf("请输入三个姓名:\n");
    for (int i = 0; i < 3; i++) {
        char temp[20] = {0};//空数组;
       // scanf("%s",*(name + i));
        scanf("%s",temp);
       //char *p
        *(name + i)= malloc(sizeof(char) * (strlen(temp) + 1));
        strcpy(*(name + i), temp);
    }
    printf("......................🐭.🐂.🐯.🐰.🐲.🐍.🐴.🐑.🐵.🐔.🐶.🐷........................\n");
    for (int i = 0; i < 3; i ++) {
        printf("%s\n",*(name + i));
    }//循环释放
    for (int i = 0; i < 3; i++) {
        free(*(name + i));
        *(name + i) = NULL;
    }*/
posted on 2015-11-21 17:23  sharkHZ  阅读(1436)  评论(0编辑  收藏  举报