Java教程

21-11-18

本文主要是介绍21-11-18,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、谈谈你对指针的理解?(指针是什么?)
指针是一种数据类型,它可以定义变量,变量保存的值是地址,由于地址是固定长度,所以指针变量的长度是固定长度;不同地址的步长不一样,导致需要不同指针类型的变量来保存;
工程应用作用:由于指针变量可以保存地址,所以可以直接操作地址,也就是可以直接操作硬件的寄存器地址,从而实现直接访问硬件;

int * p;//整型指针变量:p是一个变量,保存的是地址,该地址是整型类型的地址;
char * p2;//字符指针变量:p2是一个变量,保存的是地址,该地址是字符类型的地址
问题:地址为什么分为了不同类型?–》不同类型的指针变量保存不同步长地址
地址属性:步长(做加1操作所移动的字节数)
地址 + 操作数 = 地址;
eg:0x00000001 + 1 = ?0x00000002 或0x00000004
在这里插入图片描述

支持的运算符:
*:间接运算符 &:取地址运算符(对应的内存空间、指向的内存空间)p++:p对应的内存空间(*p)++:p指向的内存空间

在这里插入图片描述多级指针:保存上一级指针变量的地址;(远指针(巨指针)、近指针、)
变量的三大特点:占用存储空间、生命周期、存储区域
在这里插入图片描述在这里插入图片描述
注:什么时候使用多级指针?(应用场景:函数传参)
指针之间的运算:
赋值:指针之间赋值:相同类型指针之间赋值;
在这里插入图片描述

注:*void ;万能指针
可以接收任何类型指针的值

运算+:p +/- 操作数 指针 - 指针:相差数据类型的个数
不允许:指针+ 指针
使用注意事项:
1、野指针
2、指针变量的空间分配方式:动态;
编程:统计一个字符串中连续最长数字子串的个数并输出
在这里插入图片描述

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

int continue_max_str(char *src)
{
    int len = 0;
    int max_len = 0;
    
    while(*src != '\0')
    {
        while((*src >= '0' && *src <= '9') && *src != '\0')
        {
            len++;
            src++;
        }
        
        if(len > max_len)
        {
            max_len = len;
        }

        len = 0;

        src++;
    }

    return max_len;
}

int main(int agrc, char *argv[])
{
    char *src = (char *)malloc(sizeof(char) * 100);

    printf("Plesae input src:\n");
    scanf("%s", src);

    printf("src = %s\n", src);

    int max_len = continue_max_str(src);

    printf("the max len = %d\n", max_len);

    return 0;
}

野指针:
1、什么是野指针:
定义未初始化的指针、释放结束之后的指针、越界访问的指针
注:char *p;
野指针:指针变量里保存的地址对应空间无访问权限;(指针变量所指向的内存空间无访问权限)
2、野指针产生的问题:
内存泄漏——运行时错误——内存错误(段错误)
3、如何避免野指针:
养成良好的编码习惯:
1、定义指针变量时必须初始化
当指针变量作为指向工具时,定义时初始化为NULL;
当向指针变量指向的空间赋值时,需要给动态申请空间;
2、使用时:
检查内存空间是否分配成功;
初始化内存空间;
使用的时候防止越界访问
3、使用结束时:
必须释放空间;
释放之后一定要将指针再次置为NULL;
NULL
#define NULL (void *)0
NULL:代表的是0地址(不能访问,不能存储数据)

内存空间分配方式:
1、静态分配:开销小,但是空间利用率不高;
2、动态分配:开销大,提高空间的利用率;
动态分配:以字节为单位(在堆空间分配)
malloc:void * malloc(size_t size); size:sizeof(类型) * 数量
char p = (char)malloc(sizeof(char)*100);
注意事项:检查是否分配成功;返回值类型转换(相同指针类型赋值);大小必须通过sizeof(类型)*数量(保证足够的空间)

calloc:void * malloc (size_t bmem,size_t size);
char *p = (char *)calloc(sizeof(char),100);

malloc VS calloc:初始化为0;
realloc:void * realloc(void *ptr,size_t size);
当ptr置为NULL时,相当于malloc;malloc(100) == realloc (NULL,100);
当ptr不为NULL时,
size小于原来分配的空间大小,数据不会丢失,但是存在越界访问的可能;
size大于原来分配的空间大小,数据不会丢失,但是指针的指向会发生改变,因为realloc的机制是重新分配并不是追加,所以realloc开销比较大(拷贝)
size == 0,相当于free();realloc(p,0) == free(p);
//char *p = (char *)malloc(sizeof(char ) 10000);

动态分配内存为什么开销比较大?
多分配了内存用来保存使用内容信息;

如何降低malloc的开销?
内存池

这篇关于21-11-18的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!