第12章 指针

以下内容是学习尚硅谷

12.1 指针基本介绍

1)指针是C语言的精华,也是C语言的难点
2)指针,也就是内存的地址;所谓指针变量,也就是保存了内存地址的变量。关于指针的基本使用,在讲变量的时候做了入门级的介绍
3)获取变量的地址,用&,比如:int num=10,获取num的地址:&num
4)指针类型,指针变量存在的是一个地址,这个地址指向的空间存的才是值

比如: int *ptr = # ptr就是指向 int类型的指针变量,即 ptr是 int*类型。

5)获取指针类型所指向的值,使用: * (取值符号),比如: int * ptr,使用*ptr获取 ptr指向的值

12.2 什么是指针

在这里插入图片描述
在这里插入图片描述

12.3 指针的算术运算

指针是一个用数值表示的地址。可以对指针执行算术运算。可以对指针进行四种算术运算:++、–、+、-

12.3.1 指针递增操作(++)

1)案例演示

#include <stdio.h>
#include <string.h>
#include <stdio.h>

const int MAX=3;

int main(){

    int var[]={10,100,200};
    int i,*ptr;

    ptr=var;
    for(i=0;i<MAX;i++){
        printf("var[%d]地址=%p\n",i,ptr);
        printf("存储值:var[%d]=%d\n",i,*ptr);
        ptr++;//ptr=ptr+1(1个int字节数)
    }

    getchar();
    return 0;
}

2)示意图
在这里插入图片描述
3)小结

  • 数组在内存中是连续分布的
  • 当对指针进行++时,指针会按照它指向的数据类型字节数大小增加

12.3.2 指针递减操作(–)

#include <stdio.h>
#include <string.h>
#include <stdio.h>

const int MAX=3;

int main(){

    int var[]={10,100,200};
    int i,*ptr;

    ptr=&var[MAX-1];//&var[2]
    for(i=MAX;i>0;i--){
        printf("ptr存放的地址=%p\n",ptr);
        printf("存储值:var[%d]=%d\n",i-1,*ptr);
        ptr--;//ptr=ptr-1(1个int字节数)
    }

    getchar();
    return 0;
}

2)小结

  • 数组在内存中是连续分布的
  • 当对指针进行–时,指针会按照它指向的数据类型字节数大小减少

12.3.3 指针+、-操作

1)案例演示

#include <stdio.h>
#include <string.h>
#include <stdio.h>

int main(){

    int var[]={10,100,200};
    int i,*ptr;

    ptr=var;
    ptr+=2;
    printf("var[2]=%d var[2]的地址=%p ptr存储的地址=%p ptr指向的值=%d",var[2], &var[2], ptr,*ptr);

    getchar();
    return 0;
}

2)小结
可以对指针按照指定的字节数大小进行+或者–的操作,可以快速定位你要的地址

12.4 指针的比较

指针可以用关系运算符进行比较,如==、<<=和>>=。如果pl和 p2指向两个变量,比如同一个数组中的不同元素,则可对pl 和 p2进行大小比较,看下面代码,说明输出什么?

案例1

#include <stdio.h>
#include <string.h>
#include <stdio.h>

int main(){

    int var[]={10,100,200};
    int *ptr;
    ptr=var;
    
    //if(ptr == var[0]){//错误,类型不一样(int *)和(int )
        //printf("ok1");
    //}

    if(ptr==&var[0]){//可以
        printf("\nok2");
    }

    if(ptr==var){//可以
        printf("\nok3");
    }

    if(ptr>=&var[1]){//可以比较,但是返回false
        printf("\nok4");//不会输出
    }
    

    getchar();
    return 0;
}

案例2

#include <stdio.h>
#include <string.h>
#include <stdio.h>

const int MAX=3;

int main(){

    int var[]={10,100,200};
    int i,*ptr;
    ptr=var;
    i=0;
    while (ptr<=&var[MAX-2]) {
        printf("Address of var[%d]=%x\n",i,ptr);
        printf("Value of var[%d]=%d\n",i,*ptr);
        ptr++;
        i++;
    }
    
    getchar();
    return 0;
}

12.5 指针数组

12.5.1 基本介绍

要让数组的元素指向int或其他数据类型的地址(指针)。可以使用指针数组。

12.5.2 指针数组定义

数据类型 *指针数组名[大小];

1)比如:int *ptr[3];
2)ptr声明为一个指针数组
3)由3个整数指针组成。因此,ptr中的每个元素,都是一个指向int值的指针

12.5.3 指针数组快速入门和内存布局示意图

#include <stdio.h>
#include <string.h>
#include <stdio.h>

const int MAX=3;

int main(){

    int var[]={10,100,200};
    int i,*ptr[3];
    for(i=0;i<MAX;i++){
        ptr[i]=&var[i];
    }
    for(i=0;i<MAX;i++){
        printf("Value of var[%d]=%d ptr[%d]本身的地址=%p \n",i,*ptr[i],i,&ptr[i],&ptr[i]);
    }
    getchar();
    return 0;
}

在这里插入图片描述

12.6 指向指针的指针(多重指针)

12.6.1 基本介绍

在这里插入图片描述

12.6.2 多重指针(二级、三级)快速入门案例

1)一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int类型指针的指针:
int **ptr;//ptr的类型是int **
2)当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符,比如 **ptr
3)案例演示+内存布局图

#include <stdio.h>
#include <string.h>

int main(){

    int var;
    int *ptr;//一级指针
    int **pptr;//二级指针
    int ***ppptr;//三级指针
    var=3000;

    ptr=&var;
    pptr=&ptr;
    ppptr=&pptr;
    printf("var的地址=%p var=%d \n",&var,var);
    printf("ptr的本身的地址=%p ptr存放的地址=%p *ptr=%d \n",&ptr,ptr,*ptr);
    printf("pptr的本身的地址=%p pptr存放的地址=%p **pptr=%d \n",&pptr,pptr,**pptr);
    printf("ppptr的本身的地址=%p ppptr存放的地址=%p ***ppptr=%d \n",&ppptr,ppptr,***ppptr);

    getchar();
    return 0;
}

12.6.3 对应的内存布局图

在这里插入图片描述

12.7 传递指针(地址)给函数

12.8 返回指针的函数

12.9 函数指针(指向函数的指针)

12.10 回调函数

12.11 指针的注意事项和细节

12.12 动态内存分配

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SCI论文】“学术丑闻揭露:当AI写作遭遇学术审稿,ChatGPT意外成为论文共作者!“

在最近的学术圈中出现了一篇令人哭笑不得的论文。这篇文章标题为“The three-dimensional porous mesh structure of Cu-base…”发表在《Surfaces and Interfaces》杂志上&#xff0c;竟然包含了ChatGPT的提示语&#xff0c;暴露出了审稿过程中可能的疏忽。 文章讨论了铜基金…

【四 (5)数据可视化之 Pyecharts常用图表及代码实现 】

目录 文章导航一、介绍[✨ 特性]二、安装Pyecharts三、主题风格四、占比类图表1、饼图2、环形图3、玫瑰图4、玫瑰图-多图5、堆叠条形图6、百分比堆叠条形图 五、比较排序类1、条形图2、雷达图3、词云图4、漏斗图 六、趋势类图表1、折线图2、堆叠折线图3、面积图4、堆叠面积图 七…

Linux:kubernetes(k8s)有状态的服务部署(14)

之前我都是对无状态进行的一个操作&#xff0c;我们想扩容就扩容&#xff0c;想缩容就缩容&#xff0c;根本不用去考虑他的一个网络环境&#xff0c;本地储存环境啥的一个状态 当我们做有状态的服务的操作&#xff0c;肯定要申请一个持久化的一个空间&#xff0c;以及网络&…

tcp/ip协议2实现的插图,数据结构8 (30 - 32章)

(201) 201 三十0 中断优先级补充 (202) 202 三十1 TCP的用户需求 函tcp_usrreq一 (203) 203 三十2 TCP的用户需求 函tcp_usrreq二 (204) 204 三十3 TCP的用户需求 函tcp_usrreq三 (205) 205 三十4 TCP的用户需求 函tcp_usrreq四 (206) 206 三十5 TCP的用户需求 函tcp_usrreq五 …

邮件协议(SMTP、POP3、IMAP4)

电子邮件系统 1、概述 &#xff08;1&#xff09;网络电子邮件系统&#xff0c;好处在于价格低廉&#xff0c;速度非常快 &#xff08;2&#xff09;形式多样化&#xff08;文字、图像、声音……&#xff09; 2、电子邮件系统组成部分 用户代理 MUA&#xff08;Mail User …

【调参】如何为神经网络选择最合适的学习率lr-LRFinder-for-Keras

【调参】如何为神经网络选择最合适的学习率lr-LRFinder-for-Keras_学习率选择-CSDN博客文章浏览阅读9.2k次&#xff0c;点赞6次&#xff0c;收藏55次。keras 版本的LRFinder&#xff0c;借鉴 fast.ai Deep Learning course。前言学习率lr在神经网络中是最难调的全局参数&#x…

java抽象类的作用及解析

在 Java 中&#xff0c;抽象类是一种特殊的类&#xff0c;它可以用于定义一些抽象的方法和属性&#xff0c;这些方法和属性可能在子类中有不同的实现。 抽象类的主要作用包括&#xff1a; 提供抽象方法&#xff1a;抽象类可以包含一些没有具体实现的抽象方法&#xff0c;这些…

德人合科技 | 公司办公终端、电脑文件资料 \ 数据透明加密防泄密管理软件系统

天锐绿盾是一款全面的企业级数据安全解决方案&#xff0c;它专注于为企业办公终端、电脑文件资料提供数据透明加密防泄密管理。 首页 德人合科技——www.drhchina.com 这款软件系统的主要功能特点包括&#xff1a; 1. **透明加密技术**&#xff1a; 天锐绿盾采用了透明加密技…

〔理论与代码分析〕Fast-SCNN:Fast Semantic Segmentation Network(语义分割、经典网络、速度、高效、实时)

论文地址&#xff1a;Fast-SCNN: Fast Semantic Segmentation Network论文提出时间&#xff1a;2019 年 2 月 12 日官方代码&#xff1a;作者并没有放出源代码&#xff0c;因此下面是一些第三方的实现 PaddleSeg 复现代码&#xff1a;百度飞桨团队复现的代码MMSegmentation 复现…

Spring Boot+Vue前后端分离项目如何部署到服务器

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

jeesite列表jqGrid表格底部汇总,基于onSelectRow和onSelectAll实现选中行汇总合计

一、最终效果图 二、表格启用复选框并初始化赋值 onSelectAll: function() { calc_sum(); }, onSelectRow: function() { calc_sum(); },// 加载成功后执行事件 ajaxSuccess: function(data){var dy 0;var glbzqmrsdtyg 0;var glbzqmrsschyg 0;var glbzqmrsqtcy 0;…

鸿蒙-自定义组件的生命周期

目录 自定义组件的生命周期 1.aboutToAppear 2.aboutToDisappear 3.onPageShow 4.onPageHide 5.onBackPress 日志输出 1.显示页面 2.页面点击返回按钮 3.页面跳转 4.页面返回 自定义组件的生命周期 先来一段列子 import router from ohos.router Entry Component…

IO Watch:用 Arduino UNO 制造的可编程手表

MAKER:mblaz/译:趣无尽 Cherry(转载请注明出处) 关于手表的项目,之前我们已经介绍过一款《Arduino + 3D 打印 DIY 电子手表》。本期的项目同样的一款基于 Arduino UNO 的可编程的手表,相比之下制造门槛更高一些。同时它更成熟、实用,外形也很有设计感,非常的漂亮! 这…

Linux系列

安装系列 1.MySQL安装 我们要通过rpm&#xff0c;进行MySQL数据库的安装&#xff0c;主要的步骤如下&#xff1a; rpm -qa 查询当前系统中安装的所有软件 rpm -qa | grep mysql 查询当前系统中安装的名称带mysql的软件 rpm -…

YOLOv9(3):YOLOv9损失(Loss)计算

1. 写在前面 YOLOv9的Loss计算与YOLOv8如出一辙&#xff0c;仅存在略微的差异。多说一句&#xff0c;数据的预处理和导入方式都是一样的。因此如果你已经对YOLOv8了解的比较透彻&#xff0c;那么对于YOLOv9你也只是需要多关注网络结构就可以。 YOLOv9本身也是Anchor-Free的&a…

密码CTF

一、[SWPUCTF 2021 新生赛]crypto8——unencode编码 1.题目 73E-30U1&>V-H965S95]I<U]P;WE<GT 特征&#xff1a;有-&#xff0c;是uuencode编码&#xff0c;使用python脚本或者在线网站 二、[AFCTF 2018]Vigenre——维吉尼亚密码 1.题目&#xff1a; 给了一个…

vue使用elementPlus ui框架,如何给Dialog 对话框添加Loading 自定义类名显示隐藏

vue使用elementPlus ui框架时&#xff0c;如何给Dialog 对话框添加Loading 自定义类名&#xff0c;想要实现dialog对话框区域有loading效果 官方给出的这个API配置项customClass&#xff0c;使用不太明确。暂时无法实现绑定class。 最后的实现方式&#xff1a; <template&…

产品之美8| 壁纸中的图案随着用户行为变化

上一篇写了壁纸中的图案随着时间和季节变化&#xff0c;留下一个问题&#xff0c;如果壁纸随用户行为该怎样变化&#xff1f; 这一篇就是折叠手机中的壁纸&#xff0c;其中图案随着用户打开手机而动态变化。具体见图&#xff1a; 随着折叠手机的打开&#xff0c;壁纸中的小鱼进…

深度强化学习01

Random variable Probability Density Function 学习视频 这绝对是我看过最好的深度强化学习&#xff01;从入门到实战&#xff0c;7小时内干货不断&#xff01;_哔哩哔哩_bilibili

Java多线程实战-基于注解和AOP切面的异步操作日志记录解决方案

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…