指针-C语言(初阶)

目录

一、什么是指针

二、指针和指针类型

        2.1 指针+-整数

        2.2 指针的解引用

三、野指针

        3.1 野指针形成原因

        3.2 如何规避野指针

四、指针运算

        4.1 指针+-整数

        4.2 指针-指针

        4.3 指针的关系运算

五、指针和数组

六、二级指针

七、指针数组


一、什么是指针

        指针是内存中一个最小单元的编号,也就是地址。平时所说的指针指的是指针变量,是用来存放内存地址的变量。
        

         指针变量:通过&(取地址操作符)取出变量的内存起始地址,将地址存放到变量中,这个
变量就是指针变量。

      int main()
{
        int a = 10;//在内存中开辟一块空间
        int *p = &a;//p为指针变量,使用&取出变量a的地址
        return 0;
}

        指针变量用来存放地址,地址是唯一标识一个内存单元的,指针的大小在32位平台是4个字节,在64位平台是8个字节

二、指针和指针类型

        指针变量都有相应的类型

char *pc = NULL;        //字符型,存放字符类型变量的地址
int *pi = NULL;            //整型,存放整型变量的地址
short *ps = NULL;      //短整型
long *pl = NULL;        //长整型
float *pf = NULL;        //单精度型
double *pd = NULL;       //双精度型

        2.1 指针+-整数

int main()
{
        int n = 10;
        char *pc = (char*)&n;
        int *pi = &n;
        printf("%p\n", &n);
        printf("%p\n", pc);
        printf("%p\n", pc+1);
        printf("%p\n", pi);
        printf("%p\n", pi+1);
        return 0;

}

        

         指针的类型决定指针向前或向后走一步有多大(距离)

        2.2 指针的解引用

int main()
{
        int n = 0x11223344;
        char *pc = (char *)&n;
        int *pi = &n;
        *pc = 0; 
        *pi = 0;
        return 0;
}

        指针的类型决定对指针解引用时能操作几个字节。例如:char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

三、野指针

        3.1 野指针形成原因

        1. 指针未初始化

int main()
{
        int *p;        //局部变量指针未初始化,默认为随机值
        *p = 20;
        return 0;
}

        2. 指针越界访问

int main()
{
        int arr[10] = {0};
        int *p = arr;
        int i = 0;
        for(i=0; i<=11; i++)
        {
                //当指针指向的范围超出数组arr的范围,p成为野指针
                *(p++) = i;
        }
        return 0;
}

        3. 指针指向的空间释放

        3.2 如何规避野指针

        1. 指针初始化

        2. 注意指针越界

        3. 指针指向的空间释放,及时置NULL

        4. 避免返回局部变量的地址

        5. 指针使用前检查有效性

int main()
{
        int *p = NULL;
        //....
        int a = 10;
        p = &a;
        if(p != NULL)
        {
                *p = 20;
        }
        return 0;
}

四、指针运算

        指针运算包括指针+-整数、指针-指针和指针的关系运算。

        4.1 指针+-整数

int main3()
{
    float values[5];
    float* p;
    for (p = &values[0]; p < &values[5];)
    {
        *p++ = 0;
    }
}

        4.2 指针-指针

int my_strlen(char* s)
{
    char* p = s;
    while (*p != '\0')
        p++;
    return p - s;
}
int main()
{
    char arr[] = "abc";
    char* p=NULL;
    p = arr;
    printf("%d", my_strlen(p));
    return 0;
}

        4.3 指针的关系运算

for (p = &values[0]; p < &values[5];)
    {
        *p++ = 0;
    }

五、指针和数组

        除特殊的两种情况外,数组名表示的是数组首元素的地址。

        可以将数组名当成地址存放到一个指针中,使用指针来访问。

int main()
{
        int arr[] = {1,2,3,4,5,6,7,8,9,0};
        int *p = arr;         //指针存放数组首元素的地址
        int sz = sizeof(arr)/sizeof(arr[0]);
        for(i=0; i<sz; i++)
        {
                printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p+i);
        }
        return 0;
}

         p+i 计算的就是是数组 arr 下标为i的地址

六、二级指针

        int a=10;

        int *p=&a;

        int **p1=&pa;

        

         a的地址存放在p中,p的地址存放在p1中,p为一级指针,p1为二级指针。

        二级指针解引用

        int a=10;

        int *p=NULL;

        int **p1=&pa;

        *p1=&a;      //等同于 p=&a

        *p=20;        //等同于a=20

        **p1=20        //等同于*p=20-->a=20

七、指针数组

        指针数组是存放指针的数组。

        示例

int* arr[3];

        

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/83962.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Little Kernel代码学习笔记

目录 虚拟地址转换为物理地址内核启动Multiboot头部结构启动时的寄存器状态real_start段选择子初始化BSS段 页表转换设置CR4、CR3、EFER寄存器设置页表映射 初始化IDT&#xff0c;执行lk_main 虚拟地址转换为物理地址 // start.S#define PHYS_LOAD_ADDRESS (MEMBASE KERNEL_L…

RabbitMQ---订阅模型-Direct

1、 订阅模型-Direct • 有选择性的接收消息 • 在订阅模式中&#xff0c;生产者发布消息&#xff0c;所有消费者都可以获取所有消息。 • 在路由模式中&#xff0c;我们将添加一个功能 - 我们将只能订阅一部分消息。 例如&#xff0c;我们只能将重要的错误消息引导到日志文件…

华为云开发工具CodeArts IDE for C/C++ 开发使用指南

简介 CodeArts IDE是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了开发语言和调试服务。本文主要介绍CodeArts IDE for C/C的基本功能。 1.下载安装 CodeArts IDE for C/C 已开放公测&#xff0c;下载获取免费体验 2.新建C/C工程 CodeArts IDE for C/…

多维时序 | Matlab实现LSTM-Adaboost和LSTM多变量时间序列预测对比

多维时序 | Matlab实现LSTM-Adaboost和LSTM多变量时间序列预测对比 目录 多维时序 | Matlab实现LSTM-Adaboost和LSTM多变量时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | Matlab实现LSTM-Adaboost和LSTM多变量时间序列预测对比 模型…

C++:命名空间,缺省参数,函数重载,引用,内联函数

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》 文章目录 前言一、命名空间命名空间的定义命名空间的使用 二、缺省参数缺省参数概念缺省参数分类 三、函数重载函数重载的概念 四、引用引用的概念引用特性引用的使用场景引用与指针的区别 …

stm32之15.超声波与灯光功能一起实现(进阶)

主函数代码修改 --------------------- 源码 int main(void) {uint32_t t0;uint32_t distance;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);led_init();key_init();/* 初始化串口1波特率为115200bps&#xff0c;若发送/接收数据有乱码&#xff0c;请检查PLL */usart1_ini…

亚马逊云科技 云技能孵化营 初识机器学习

目录 前言 一、课程介绍 二、什么是机器学习 三、机器学习算法进阶过程 四、亚马逊云科技能给我们什么 总结 前言 近期参加了“亚马逊云科技 云技能孵化营”&#xff0c;该孵化营的亚马逊云科技培训与认证团队为开发者准备了云从业者的精要知识及入门课程&#xff0c;帮助…

MybatisPlus(1)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 MyBatis-Plus&#xff08;简称MP&#xff09;是一个 Mybatis 的增强工具&…

【PHP】数据类型运算符位运算

文章目录 数据类型简单&#xff08;基本&#xff09;数据类型&#xff1a;4个小类复合数据类型&#xff1a;2个小类特殊数据类型&#xff1a;2个小类类型转换类型判断整数类型浮点类型布尔类型 运算符赋值运算符算术运算符比较运算符逻辑运算符连接运算符错误抑制符三目运算符自…

[PyTorch][chapter 51][Auto-Encoder -1]

目录&#xff1a; 简介 损失函数 自动编码器的类型 一 AutoEncoder 简介&#xff1a; 自动编码器是一种神经网络&#xff0c;用于无监督学习任务.(没有标签或标记数据), 例如降维,特征提取和数据压缩. 主要任务&#xff1a; 1&#xff1a; 输入数据 …

WPS右键新建没有docx pptx xlsx 修复

解决wps右键没有新建文档的问题 右键没有新建PPT和Excel 1 wps自带的修复直接修复没有用 以上不管咋修复都没用 2 先编辑注册表 找到 HKEY_CLASSES_ROOT CTRLF搜文件扩展名 pptx docx xlsx 新建字符串 三种扩展名都一样操作 注册表编辑之后再次使用wps修复 注册组件&am…

Python中实例方法、类方法、静态方法的区别与作用

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 Python中至少有三种比较常见的方法类型&#xff0c;即实例方法&#xff0c;类方法、静态方法。 它们是如何定义的呢&#xff1f;如何调用的呢&#xff1f;它们又有何区别和作用呢&#xff1f;且看下文。 首先&#xf…