指针-C语言(初阶)

news2024/9/24 23:25:03

目录

一、什么是指针

二、指针和指针类型

        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.coloradmin.cn/o/930559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k-近邻算法概述,k-means与k-NN的区别对比

目录 k-近邻算法概述 k-近邻算法细节 k值的选取 分类器的决策 k-means与k-NN的区别对比 k-近邻算法概述 k近邻&#xff08;k-nearest neighbor, k-NN&#xff09;算法由 Cover 和 Hart 于1968年提出&#xff0c;是一种简单的分类方法。通俗来说&#xff0c;就是给定一个…

Linux操作系统--网络配置(2)

在上一次课程中,我们对Linux课程中的网络有了一个了解,下面我们来看看如何配置网络IP。 1.配置网络IP地址 在Linux操作系统中,比如搭建集群,这一个时候如果使用DHCP实现动态IP的分配,那么如果需要访问管理其中一个节点操作时候,就需要通过其IP访问。这一个时候还得去查看…

十五、systemctl命令如何使用?

在Linux系统中&#xff0c;一些内置服务可以通过systemctl控制&#xff0c;部分第三方软件也可以通过systemctl控制。 1、基础语法 start&#xff1a;开启服务&#xff1b; stop&#xff1a;关闭服务&#xff1b; status&#xff1a;查看服务当前状态&#xff1b; enable&a…

【推荐】Spring与Mybatis集成整合

目录 1.概述 2.集成 2.1代码演示&#xff1a; 3.整合 3.1概述 3.2 进行整合分页 接着上两篇&#xff0c;我已经写了Mybatis动态之灵活使用&#xff0c;mybatis的分页和特殊字符的使用方式接下来把它们集成起来&#xff0c;是如何的呢&#x1f447;&#x1f447;&#x1…

Stm32的时钟系统以及使用SysTick滴答定时器实现延时

前言 STM32的时钟系统由多个时钟源和时钟树组成时钟源包括主时钟源&#xff08;HSE&#xff09;、内部高速时钟源&#xff08;HSI&#xff09;、内部低速时钟源&#xff08;LSI&#xff09;和外部低速时钟源&#xff08;LSE&#xff09;。时钟树由多个时钟分频器和时钟门控器组…

五、多表查询-2.概述分类

一、多表查询概述 二、演示 1、准备数据 &#xff08;1&#xff09;创建emp1表并注入数据&#xff0c;添加外键&#xff1a; 2、多表查询 一共 102条数据&#xff1a;17个员工&#xff0c;6个部门&#xff0c;176102 3、消除笛卡尔积 一共16条记录&#xff1a; 为啥17个员工&…

Aos插件实现滚动动画效果

aos文档 aos使用感受跟wow相似&#xff0c;但比wow多了浏览器回滚&#xff0c;动画效果会再次展现 安装 npm install aos使用 main.js全局导入css import aos/dist/aos.cssvue文件 <template><div class"box"><div class"code" v-for&q…

Java接收json参数

JSON 并不是唯一能够实现在互联网中传输数据的方式&#xff0c;除此之外还有一种 XML 格式。JSON 和 XML 能够执行许多相同的任务&#xff0c;那么我们为什么要使用 JSON&#xff0c;而不是 XML 呢&#xff1f; 之所以使用 JSON&#xff0c;最主要的原因是 JavaScript。众所周知…

搭建 Qt6 开发环境

作者&#xff1a; 一去、二三里 个人微信号&#xff1a; iwaleon 微信公众号&#xff1a; 高效程序员 Qt 是一个跨平台的 C 应用程序开发框架&#xff0c;它提供了丰富的组件库和工具&#xff0c;使得开发人员可以在各种平台上轻松地开发 GUI 应用程序。 由于我们的教程 《细说…

嵌入式设备应用开发(发现需求和提升价值)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 很多做技术的同学,都会陷入到技术的窠臼之中。对于如何做具体的产品、实现具体的技术,他们可能很感兴趣。但是做出来的东西做什么用,或者说是有没有竞争力,事实上他们不是很关心…

二叉搜索树-----红黑树

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——红黑树☂️<3>开发环境&#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;红黑树也是一颗二叉搜索树&#xff0c;其作为map&#xff0c;set的底层…

AttributeError: module ‘torchvision.io.image‘ has no attribute ‘ImageReadMode‘

我的torch和torchvision版本 import torch torch.__version__‘1.7.1cu110’ import torchvision torchvision.__version__‘0.8.2cu110’ 原代码 mode torchvision.io.image.ImageReadMode.RGB labels.append(torchvision.io.read_image(os.path.join(voc_dir, Segmentat…

文生图模型之Stable Diffusion

原始文章地址 autoencoder CLIP text encoder tokenizer最大长度为77&#xff08;CLIP训练时所采用的设置&#xff09;&#xff0c;当输入text的tokens数量超过77后&#xff0c;将进行截断&#xff0c;如果不足则进行paddings&#xff0c;这样将保证无论输入任何长度的文本&…

Vue2向Vue3过度核心技术综合案例

目录 1 面经基础版-案例效果分析1.面经效果演示2.功能分析3.实现思路分析&#xff1a;配置路由功能实现 2 面经基础版-一级路由配置3 面经基础版-二级路由配置1.使用场景2.语法3.代码实现 4 面经基础版-二级导航高亮1.实现思路2.代码实现 5 面经基础版-首页请求渲染1.步骤分析2…

新开通的抖店体验分太低,达人不愿意合作怎么办?解决办法如下

我是王路飞。 找达人带货的玩法是最适合新手抖店商家的&#xff0c;同时也是最适合长线去玩的方法。 但是新手前期找达人的时候&#xff0c;会有一个难点&#xff0c;就是自己的抖店因为是新开通的&#xff0c;所以要么没体验分&#xff0c;要么就是体验分太低了&#xff0c;…

崔东树:汽车行业正在迎来令人兴奋的时代,智能座舱推动私车普及

随着新能源汽车和智能座舱的不断发展&#xff0c;汽车行业正经历着一场革命性的变革。当前&#xff0c;不仅汽车电动化的进程在加速推进&#xff0c;智能座舱的升级与完善也成为了行业的热点话题。崔东树指出&#xff0c;随着汽车电动化和智能化的发展&#xff0c;智能座舱的快…

学习高等数学需要的初等数学知识

文章目录 名词解释常用希腊字符读音幂、根式和对数常用的三角函数值三角函数变换一元二次方程求解充分条件和必要条件切线方程、斜率和法线隐函数极坐标排列组合 名词解释 教材中存在着许多熟悉且陌生的词汇&#xff0c;作者在此进行了整理&#xff1a; 概念&#xff1a;概念…

开始MySQL之路—— DDL语法、DML语法、DQL语法基本操作详解

DDL语法 DDL&#xff08;Data Definition Language&#xff09; 数据定义语言&#xff0c;该语言部分包括以下内容。 对数据库的常用操作 对表结构的常用操作 修改表结构 对数据库的常用操作 1: 查看当前所有的数据库 show databases; 2&#xff1a;创建数据库 create dat…

Linux下的Shell基础——流程控制(三)

前言&#xff1a; 每门编程都有它独特的语法&#xff0c;比如C语言&#xff0c;Java等编程语言&#xff0c;有相同的地方也有自己独特的地方&#xff0c;但都离不开变量、运算符&#xff0c;条件判断、循环和函数这几个地方的学习&#xff0c;下面就让我们学习一下shell编程里…

CRM软件的功能与报价如何制定?

CRM软件很贵吗&#xff1f;CRM价格与系统功能、部署方式、用户数量、附加服务等有关。当然&#xff0c;不同的CRM厂商&#xff0c;也会有不同的定价模式。下面我们就来说说决定CRM系统报价的几个因素。 系统功能&#xff1a; CRM软件的功能越全面、越强大&#xff0c;其定价也…