Day12 C基础(指针进阶)

news2025/2/25 14:07:30

文章目录

  • 指针修饰
    • 1.const 修饰
    • 2.void
  • 大小端
  • 二级指针
  • 指针和数组
    • 1.指针和一维数组
      • 直接访问:
      • 间接访问:
    • 2.指针和二维数组
      • 直接访问:
      • 间接访问:
  • 数组指针

指针修饰

1.const 修饰

1)const int num = 10;

const int num = 10;
   num = 3; 

int* p = #
*p = 3;  // 可以

2)const int *p; // 修饰 *p ,指针指向的内容不能更改,指针的指向可以修改
int const *p; // 也可以这样表示修饰 *p

int num = 10;
 const int *p = #
 *p = 20;  // 错误,因为 *p 被修饰

int sum = 20;
p = ∑  // 可以

3)int* const p; // 修饰 p ,指针的指向不能修改的,指针指向的内容可以修改
int num = 10;
int sum = 20;
int* const p = #

p = ∑  // 错误
*p = 20; // 可以

4)修饰函数参数

2.void

void num;  // 不允许修饰变量
void* p;   // p 是任意类型的指针

使用场景:函数参数或函数返回值

注意:通过 void 类型指针进行取内容,需要对地址进行强转
强转方式:void* p = NULL; 强转 (int *)p 取内容: *((int *)p)

大小端

在计算机进行超过1字节数据进行存储的时候,会出现存储数据顺序不同的情况即大小端存储

Big-Endian(大端字节序)大端:在低地址存放高字节数据,高地址存放低字节数据
Little-Endian(小端字节序)小端:在低地址存放低字节数据,高地址存放高字节数据

举例:存储数据 0x12345678,起始地址 0x4000

0x4000 0x4001 0x4002 0x4003

大端:0x12 34 56 78
小端:0x78 56 34 12
在这里插入图片描述

查看电脑是大端还是小端,代码如下:

int a = 0x12345678;
char b;
b = (char)a;
printf(“%#x\n”, b);

// 电脑是小端,网络是大端
// 电脑向网络传输东西,数据要从小端变成大端,传出去
// 网络向电脑传输东西,数据要从大端转成小端,接收过来

二级指针

一级指针:存放变量地址
二级指针:存放的是一级指针的地址

格式: 存储类型 数据类型 **指针变量名

int num = 10;
int *p = #
int **q = &p;

访问 num 的值:
num *p **q

访问 num 的地址:
&num p *q

访问 p 的地址:
&p q

指针和数组

直接访问:按变量的地址存取变量的值(通过数组名访问)
间接访问:通过存放变量地址的变量去访问变量(通过指针访问)

1.指针和一维数组

int a[5] = {1, 2, 3, 4, 5};
int *p = arr;

直接访问:

在这里插入图片描述

 int a[5] = {1, 2, 3, 4, 5};
    int *p = a;
    printf("%p %p %p\n", a, a+1, a+3);  // 直接访问元素的地址
    printf("%d %d\n", a[1], *(a+1));

间接访问:

在这里插入图片描述

 int a[5] = {1, 2, 3, 4, 5};
    int *p = a;
    
    printf("%p %p %p\n", a, a+1, a+2);
    printf("%p %p %p\n", p, p+1, p+2);
    printf("%d %d %d\n", *p, *(p+1), *(p+2));
    printf("%d %d %d\n", p[0], p[1], p[2]);

a 和 p 本质上不同,a地址常量, p是变量,a不能执行 ++ 操作,但是 p 可以

访问数组元素a[i]的值:
直接访问:a[i] *(a+i)
间接访问:p[i] *(p+i)

访问数组元素a[i]的地址:
直接访问:&a[i] a+i
间接访问:&p[i] p+i

int a[3] = {3, 2, 1};
int *p = a;
printf(“%d\n”, *p++); // 3 在打印一次的话就是 2
printf(“%d\n”, *a++); // 错误,a地址常量

运算方法:
1)++ 和 * 都是单目运算符,优先级相同
2)单目运算符从右向左进行运算

int a[3] = {3, 2, 1};
int *p = a;
printf(“%d\n”, 下列打印);
*(p++) // 3 实际上指针指向到了第二个元素的地址
(*p)++ // 打印出来是 3,实际上第一个元素值变成 4
++*p // 打印出来 4,自加完之后的值
++(*p) // 同上
*++p; // 2,先将指针向高地址方向移动一个数据单位,然后取地址内容
*(++p); // 同上

2.指针和二维数组

int a[2][3] = {1, 2, 3, 4, 5, 6}; // a:数组名:表示第一行的首地址,a+1:第二行首地址

在a前面加*,表示将行地址降级为列地址
*a+0:第一行第一列的地址
*a+1:第一行第二列的地址
*(a+1):第二行第一列的地址
*(a+1)+1:第二行第二列的地址

a[0]:第一行第一列的地址
a[0]+1:第一行第二列的地址
a[1]:第二行第一列的地址
a[1]+1:第二行第二列的地址

直接访问:

在这里插入图片描述

间接访问:

同上

数组指针

定义:本质是指针,指向的是数组(又称行指针)
格式:存储类型 数据类型 (*指针变量名)[列数];

int a[2][3] = {1, 2, 3, 4, 5, 6};
int (*p)[3] = a;

p:int (*)[3]; 运算三个三个运算
p可以代替a进行元素访问,但是本质不同

访问 a[i][j] 的地址:
*(p+i)+j &p[i][j] p[i]+j

访问a[i][j]的元素
((p+i)+j) *(p[i]+j) p[i][j]

大小
sizeof§ == 4

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

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

相关文章

【面试合集】说说微信小程序的实现原理?

面试官:说说微信小程序的实现原理? 一、背景 网页开发,渲染线程和脚本是互斥的,这也是为什么长时间的脚本运行可能会导致页面失去响应的原因,本质就是我们常说的 JS 是单线程的 而在小程序中,选择了 H…

Mac系统下,保姆级Jenkins自动化部署Android

一、Jenkins自动化部署 1、安装jenkins 官网:macOS Installers for Jenkins LTS 选择macOS brew install jenkins-lts 安装最新: brew install jenkins-lts 启动jenkins服务: brew services start jenkins-lts 重启jenkins服务: brew services restart jenkin…

YOLOv5改进系列(27)——添加SCConv注意力卷积(CVPR 2023|即插即用的高效卷积模块)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制 YOLOv5改进系列(2)——添加CBAM注意力机制 YOLOv5改进系列&…

Netty-Netty源码分析

Netty线程模型图 Netty线程模型源码剖析图 Netty高并发高性能架构设计精髓 主从Reactor线程模型NIO多路复用非阻塞无锁串行化设计思想支持高性能序列化协议零拷贝(直接内存的使用)ByteBuf内存池设计灵活的TCP参数配置能力并发优化 无锁串行化设计思想 在大多数场景下&#…

如何用GPT进行论文润色与改写?

详情点击链接:如何用GPT/GPT4进行论文润色与改写?一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二…

1.16 day3 IO网络编程

用udp实现tftp下载功能 #include <myhead.h> #define PORT 69 #define IP "192.168.122.24" int xiazai(int sfd,struct sockaddr_in sin,int fd,socklen_t socklen) {char buf[516]"";char ack[4];short *p1(short *)buf;*p1htons(1);char *p2buf2…

数字化转型:为何失败率居高不下,以及如何避免重蹈覆辙

在当今快速发展的数字化时代&#xff0c;许多企业纷纷投身于数字化转型的浪潮中&#xff0c;以期通过技术革新提升竞争力、优化运营、提高效率。然而&#xff0c;尽管数字化转型的潜在益处巨大&#xff0c;但失败率却居高不下&#xff0c;甚至导致企业陷入困境。 本文将深入探讨…

Git版本控制——分支

分支 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着可以把工作从开发主线上分离开来进行重大的Bug修改、开发新的功能&#xff0c;以免影响开发主线。 查看本地分支 git branch创建本地分支 git branch 分支名切换分支(checkout) git checkout 分支名创建…

jenkins url发生改变如何修改回来

问题&#xff1a; 我的jenkins服务器部署完后&#xff0c;此时url就已经固定了如下&#xff1a; 但是我更换了公网IP&#xff0c;url地址还是旧的&#xff0c;现在就需要修改一下配置文件&#xff1b; 修改配置文件 ($JENKINS_HOME/jenkins.model.JenkinsLocationConfiguratio…

java日志框架总结

一、日志框架简单分类介绍 java常用的日志框架、可以分为两组&#xff1a; 1、JCL、JUL、Log4j&#xff1b; 2、SLF4J、Log4j2、Logback&#xff1b; 其中第一组是比较早期的日志实现框架&#xff0c;JCL并不是具体的日志实现框架&#xff0c;JCL其实是定义了一…

SparkSQL——Dataset

Dataset Dataset 是什么&#xff1f; Testdef dataset1():Unit {// 1. 创建 SparkSessionval spark new SparkSession.Builder().master("local[6]").appName("dataset1").getOrCreate()// 2. 导入隐式转换import spark.implicits._// 3. 演示val sourceR…

单元测试之Stub和Mock

实例 Analyze类会检查filename的长度&#xff0c;如果小于8&#xff0c;我们就会使用一个实现IWebService的类来记录错误. 我们需要给Analyze方法写单元测试。 public class LogAnalyzer {private IWebService service;private IEmailService email;public IWebService Serv…

小程序基础学习(登录)(重点核心)

首先&#xff0c;获取用户获取code&#xff0c;然后带着code向服务器发送请求&#xff0c;并把返回的token存入缓存中 然后&#xff0c;判断token是否过期如果过期则要重新登录 页面代码 <!--pages/me/me.wxml--> <navigation-bar title"牧原" back"{…

计算机网络 网络安全

网络安全 网络安全问题概述 计算机网络面临的女全性威胁 计算机网络的通信而临两大类威胁&#xff0c;即被动攻击和主动攻击 被动攻击是指攻击者从网络上窃听他人的通信内容。通常把这类攻击称为截获。在被动攻击中&#xff0c;攻击者只是观察和分析某一个协议数据单元 PDU…

Unity解决Udp客户端无法接收数据的问题

Unity解决Udp客户端无法接收数据的问题 在我之前做过的项目中&#xff0c;其中不少涉及Udp客户端的项目。在这些项目中&#xff0c;一般只需要实现客户端向服务器端发送数据的功能就可以了&#xff0c;一般都不用接收服务器端发送的数据&#xff0c;但是也有同学使用了我分享的…

接近8000字的SpringSpring常用注解总结!安排

接近8000字的Spring/Spring常用注解总结&#xff01;安排 为什么要写这篇文章&#xff1f; 最近看到网上有一篇关于 SpringBoot 常用注解的文章被转载的比较多&#xff0c;我看了文章内容之后属实觉得质量有点低&#xff0c;并且有点会误导没有太多实际使用经验的人&#xff…

ceph数据分布式存储

单机存储的问题 存储处理能力不足 传统的IDE的IO值是100次/秒&#xff0c;SATA固态磁盘500次/秒&#xff0c;固态硬盘达到2000-4000次/秒。即使磁盘的IO能力再大数十倍&#xff0c;也不够抗住网站访问高峰期数十万、数百万甚至上亿用户的同时访问&#xff0c;这同时还要受到主机…

1、机器学习模型的工作方式

第一步,如果你是机器学习新手。 本课程所需数据集夸克网盘下载链接:https://pan.quark.cn/s/9b4e9a1246b2 提取码:uDzP 文章目录 1、简介2、决策树优化3、继续1、简介 我们将从机器学习模型如何工作以及如何使用它们的概述开始。如果你以前做过统计建模或机器学习,这可能感…

【机器学习】强化学习(二)基于动态规划的算法

值函数可以分为状态价值函数和动作价值函数&#xff0c;分别适用于哪些强化学习问题 二、基于动态规划的算法 2.1 策略迭代算法 示例&#xff1a; (改进的) 策略迭代 代码 首先定义了一些参数&#xff0c;如奖励、折扣因子、最大误差等&#xff0c;然后初始化了一个网格世界的环…

【JVM调优系列】如何导出堆内存文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…