指针-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.rhkb.cn/news/106612.html

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

相关文章

【八股】2023秋招八股复习笔记4(MySQL Redis等)

文章目录 目录1、MySQLmysql索引实现mysql索引优化mysql索引失效的情况mysql 千万数据优化mysql 事务隔离级别 & 实现原理mysql MVCC版本链&#xff08;undo log&#xff09;mysql数据同步机制 & 主从复制 &#xff08;binlog&#xff09;mysql 日志&数据恢复&…

5G NR:RACH流程-- Msg1之生成PRACH Preamble

随机接入流程中的Msg1&#xff0c;即在PRACH信道上发送random access preamble。涉及到两个问题&#xff1a; 一个是如何产生preamble&#xff1f;一个是如何选择正确的PRACH时频资源发送所选的preamble? 一、PRACH Preamble是什么 PRACH Preamble从数学上来讲是一个长度为…

MyBatis与Spring的集成整合加优化分页功能

目录 一.为什么要将MyBatis和Spring整合&#xff1f;&#xff1f;&#xff1f; 二.配置环境 2.1 pom文件 2.2 xml文件 三.演示举例 四.Aop整合pageHelper 分页插件 今天的分享就到这啦&#xff01;&#xff01;&#xff01; 一.为什么要将MyBatis和Spring整合&#xff1f…

自动驾驶感知传感器标定安装说明

1. 概述 本标定程序为整合现开发的高速车所有标定模块,可实现相机内参标定和激光、相机、前向毫米波 至车辆后轴中心标定,标定参数串联传递并提供可视化工具验证各个模块标定精度。整体标定流程如下,标定顺序为下图前标0-->1-->2-->3,相同编号标定顺序没有强制要求…

【业务功能篇83】微服务SpringCloud-ElasticSearch-Kibanan-docke安装-应用层实战

五、ElasticSearch应用 1.ES 的Java API两种方式 Elasticsearch 的API 分为 REST Client API&#xff08;http请求形式&#xff09;以及 transportClient API两种。相比来说transportClient API效率更高&#xff0c;transportClient 是通过Elasticsearch内部RPC的形式进行请求…

共享内存 windows和linux

服务端&#xff0c;即写入端 #include <iostream> #include <string.h> #define BUF_SIZE 1024 #ifdef _WIN32 #include <windows.h> #define SHARENAME L"shareMemory" HANDLE g_MapFIle; LPVOID g_baseBuffer; #else #define SHARENAME "sh…

使用通信顺序进程(CSP)模型的 Go 语言通道

在并发编程中&#xff0c;许多编程语言采用共享内存/状态模型。然而&#xff0c;Go 通过实现 通信顺序进程&#xff08;CSP&#xff09;模型来区别于众多。在CSP中&#xff0c;程序由不共享状态的并行进程组成&#xff1b;相反&#xff0c;它们通过通道进行通信和同步操作。因此…

wireshark抓包

Wireshark是非常流行的网络封包分析软件&#xff0c;可以截取各种网络数据包&#xff0c;并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括&#xff1a; 1、Wireshark软件下载和安装以及Wireshark主界面介绍。 2、WireShark简单抓包示例。通过该例子学…

最新绕过目标域名CDN进行信息收集技术

绕过目标域名CDN进行信息收集 1&#xff0e;CDN简介及工作流程 CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;的目的是通过在现有的网络架构中增加一层新的Cache&#xff08;缓存&#xff09;层&#xff0c;将网站的内容发布到最接近用户的网…

ubuntu下自启动设置,为了开机自启动launch文件

1、书写sh脚本文件 每隔5秒钟启动一个launch文件&#xff0c;也可以直接在一个launch文件中启动多个&#xff0c;这里为了确保启动顺利&#xff0c;添加了一些延时 #! /bin/bash ### BEGIN INIT sleep 5 gnome-terminal -- bash -c "source /opt/ros/melodic/setup.bash…

uniapp - 全平台兼容实现上传图片带进度条功能,用户上传图像到服务器时显示上传进度条效果功能(一键复制源码,开箱即用)

效果图 uniapp小程序/h5网页/app实现上传图片并监听上传进度,显示进度条完整功能示例代码 一键复制,改下样式即可。 全部代码 记得改下样式,或直接

MyBatis的基本入门及Idea搭建MyBatis坏境且如何一步骤实现增删改查(CRUD)---详细介绍

一&#xff0c;MaBatis是什么&#xff1f; 首先是一个开源的Java持久化框架&#xff0c;它可以帮助开发人员简化数据库访问的过程并提供了一种将SQL语句与Java代码进行解耦的方式&#xff0c;使得开发人员可以更加灵活地进行数据库操作。 1.1 Mabatis 受欢迎的点 MyBatis不仅是…

使用CSS的@media screen 规则为不同的屏幕尺寸设置不同的样式(响应式图片布局)

当你想要在不同的屏幕尺寸或设备上应用不同的CSS样式时&#xff0c;可以使用 media 规则&#xff0c;特别是 media screen 规则。这允许你根据不同的屏幕特性&#xff0c;如宽度、高度、方向等&#xff0c;为不同的屏幕尺寸设置不同的样式。 具体来说&#xff0c;media screen…

【Spring MVC】

目录 &#x1f36e;1 什么是 MVC &#xff1f; &#x1f381;2 Spring MVC 的连接 &#x1f358;2.1 RequestMapping 实现 POST 和 GET 请求 &#x1f963;2.2 GetMapping 只支持 GET 请求 &#x1fad6;2.3 PostMapping 只支持 POST 请求 &#x1f36c;3 Spring MVC 获取参数的…

Spring复习:(56)PropertySourcePlaceholderConfigurer的工作原理

PropertySourcePlaceholderConfigurer的用途&#xff1a;通过配置文件&#xff08;比如.properties文件&#xff09;给bean设置属性&#xff0c;替代属性占位符 示例&#xff1a; 属性配置文件 spring.datasource.urljdbc:mysql://xxx.xxx.xxx.xxx/test spring.datasource.us…

【数仓建设系列之三】数仓建模方式及如何评估数仓完善性

【数仓建设系列之三】数仓建模方式及如何评估数仓完善性 上篇文章我们对数仓的分层架构及核心概念做了简单介绍&#xff0c;同时也指明DW层是数仓建模的核心层。本篇文章&#xff0c;将详细从常见的维度模型建设手段及如何评估数仓建设的完善性展开讨论。 一、数仓维度建模 ​…

Vue2向Vue3过度核心技术进阶语法

目录 1 v-model简化代码1.目标&#xff1a;2.如何简化&#xff1a;3.代码示例 2 sync修饰符1.作用2.场景3.本质4.语法5.代码示例6.总结 3 ref和$refs1.作用2.特点&#xff1a;3.语法4.注意5.代码示例 4 异步更新 & $nextTick1.需求2.代码实现3.问题4.解决方案 1 v-model简化…

Scikit-learn强化学习代码批注及相关练习

一、游戏介绍 木棒每保持平衡1个时间步&#xff0c;就得到1分。每一场游戏的最高得分为200分每一场游戏的结束条件为木棒倾斜角度大于41.8或者已经达到200分。最终获胜条件为最近100场游戏的平均得分高于195。代码中env.step&#xff08;&#xff09;&#xff0c;的返回值就分…

openresty安装与网站发布

文章目录 安装依赖下载安装包解压安装包安装启动nginx配置环境变量配置开机启动发布静态网站 OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台&#xff0c;其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动…

Docker(一)-安装、架构、业务开发常用命令、Dockerile、镜像卷、镜像仓库

基于业务开发使用Docker Docker是一个开源的容器引擎&#xff0c;它有助于更快地交付应用。Docker可将应用程序和基础设施层隔离&#xff0c;并且能将基础设施当作程序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序&#xff0c;并可以缩短从编写到部署运行代码…