C语言----指针

目录
1.概念
2.格式
3.指针操作符
4.初始化
1. 将普通变量的地址赋值给指针变量
a. 将数组的首地址赋值给指针变量
b. 将指针变量里面保存的地址赋值给另一个指针变量
5.指针运算
5.1算术运算
5.2 关系运算
指针的大小
总结:
段错误
指针修饰
1. const修饰
2. void
大小端
二级指针
指针和数组
1. 指针和一维数组
直接访问:
间接访问:
2. 指针和二维数组
直接访问:
间接访问:
数组指针
数组指针
定义:本质是指针,指向的是数组(又称行指针)
格式:存储类型数据类型(*指针变量名)[列数];
大小

指针的优点:
- 使程序更加简洁、紧凑、高效
- 有效的表达更复杂的数据结构
- 动态分配内存
- 得到多余一个数的函数的返回值
1.概念
地址:内存中每个字节单元都有点编号
指针:指针就是地址
指针变量:用于存放地址的变量叫做指针变量
2.格式
存储类型 数据类型 * 指针变量名
int* p;
使用:
int a=5;
int* p=&a;
char ch=‘t’;
char* p=&ch;
3.指针操作符
&:取地址符--->取变量的地址
*:取内容 --->取地址里面的内容
*&a==a;// *和&是互逆运算
// a是变量就是错的,a是地址就是对的
&*a
4.初始化
指针变量只使用前不仅要定义还要初始化,未初始化的指针变量是不能随便使用的,会产生野指针
int* p;
1. 将普通变量的地址赋值给指针变量
int a=10;
1)int* p=&a;//定义的同时赋值
2)int* p=NULL;//先定义指针变量在进行赋值
p=&a;
int* p = NULL; // int *p
p = &a;
printf("%d %d\n", a, *p); // 打印 a 的值 10 10
printf("%p %p\n", &a, p); // 打印 a 的地址*p = 3;
printf("%d %d\n", a, *p); // 打印 a 的值 3 3
printf("%p %p\n", &a, p); // 打印 a 的地址
a. 将数组的首地址赋值给指针变量
char str[10] = "hello";
char* p = str; // 指针指向数组的首地址,指向字符'h'的地址
b. 将指针变量里面保存的地址赋值给另一个指针变量
floatf = 1.3;
float* p = &f;
float* q = p;
5.指针运算
5.1算术运算
char str[32] = "hello";
char* p = str;
p++; // 指针向高地址方向移动一个数据单位(看数据类型),指针指向发生变化
p--; // 指针向低地址方向移动一个数据单位(看数据类型),指针指向发生变化
int* p; p++;// 移动4字节
double*p; p++; // 移动8字节
p+n:访问高地址方向第n 个数据的地址,指针指向不会发生变化
p-n:访问低地址方向第n 个数据的地址,指针指向不会发生变化
偏移了多少地址(字节) = n *sizeof(数据类型)
两个地址之间的差 = 两个地址之间相隔元素的个数
q - p=两个地址之间相隔的元素个数
char str[] = "hello";
char* p = str;
char* q = p+3;
printf("%d\n", q - p);
5.2 关系运算
> < == !=
指针之间的关系运算比较的是它指向地址的高低
高地址的指针大于低地址的指针
char str[32] = "hello";char* p1 = &str[1];
char* p2 = &str[3];p2 > p1注意:指向不同类型的数组指针关系运算没有意义,指向不同区域的指针关系运算也没有意义
(同一个数组间进行比较)
指针的大小
int a = 5;
int* p = &a; // 4
short b = 2;
short* p1 = &b; // 4
double c = 1.1;
double* p2 = &c; // 4szieof(指针变量名)32位操作系统:指针为4字节
8位16进制表示,4字节64位操作系统:指针为8字节
16位16进制表示,8字节
总结:
1.32位操作系统:指针为4字节, 64位操作系统:指针为8字节
2. 内存地址是固定的,但是变量的地址不固定的(栈区随机分配)
3. 指针类型根据指针指向空间的数据类型
段错误
Segentation fault (core dumped
1) 野指针,没有规定指向的指针会在内存中乱指,野指针产生原因
1. 指针变量定义没赋值
2. 指针 p被 free之后,没有置 NULL,会让人以为p是合法指针
解决:int* p = NULL;
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=&num;
*p=20;//错误,因为*p被修饰
int sum=20;
p=&sum;//可以
3)int* const p;//修饰p,指针的指向不能修改,但是指针指向的内容可以修改
int num=10;
int sum=20;
int* const p=&num;
p=*sum;//错误
*p=20;//可以
4)修饰函数参数
2. void
void num;//不允许修饰变量void* p; //p是任意类型的指针,需要强转才能使用使用场景:函数参数或者函数返回值注意:通过void类型指针进行取内容,需要对地址进行强转强转方式:void* p=NULL;强转(int*)p 取内容*((int* )p)
大小端
TCP协议(三次握手四次挥手){网编时应用}
在计算机进行超过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
inta[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(p) ==4
相关文章:
C语言----指针
目录 1.概念 2.格式 3.指针操作符 4.初始化 1. 将普通变量的地址赋值给指针变量 a. 将数组的首地址赋值给指针变量 b. 将指针变量里面保存的地址赋值给另一个指针变量 5.指针运算 5.1算术运算 5.2 关系运算 指针的大小 总结: 段错误 指针修饰 1. con…...
树莓派之旅-在wsl-x86-64 上进行树莓派的交叉编译
前情提要: 想把自己花里胡哨的终端丢到树莓派上去,可是树莓派算力不够,编译时间过于漫长 交叉编译 定义网上有,懒得复制了,大概就是在本机电脑上编译目标平台的可执行文件 这里的目标平台是树莓派 使用 uname -m …...
nature reviews genetics | 需要更多的针对不同种族的癌症基因组图谱研究,促进精准治疗和维护治疗公平权益
–https://doi.org/10.1038/s41576-024-00796-w Genomic landscape of cancer in racially and ethnically diverse populations 研究团队和单位 Ulrike Peters–Public Health Sciences Division, Fred Hutchinson Cancer Center Claire E. Thomas–Public Health Scienc…...
代码随想录算法训练营day18
代码随想录算法训练营 —day18 文章目录 代码随想录算法训练营前言一、530.二叉搜索树的最小绝对差递归法迭代法 二、501.二叉搜索树中的众数普通二叉树的方法递归法中序迭代法 三、 236. 二叉树的最近公共祖先递归法 总结 前言 今天是算法营的第18天,希望自己能够…...
Kafka安全优化文档:漏洞修复到安全加固
文章目录 1.1.漏洞修复1.1.1.Apache Kafka反序列化漏洞1.1.2.pm2-kafka代码执行漏洞1.1.3.Apache Kafka安全绕过漏洞1.1.4.Apache Kafka Distribution - Schema Repository跨站请求伪造漏洞1.1.5.Apache Kafka输入验证错误漏洞的补丁1.1.6.Apache Kafka信息泄露漏洞1.1.7.Apach…...
Markdown如何添加任务列表-复选框的添加
Markdown如何添加任务列表-复选框的添加 前言语法讲解使用场景及应用实例代码整和渲染结果小结其他文章快来试试吧☺️ Markdown如何添加任务列表-复选框的添加👈点击这里也可查看 前言 To-do任务列表是一种很常见的时间管理工具,它适用于工作计划&…...
基于下垂控制的构网变换器功率控制【微电网变流器】【Simulink】
目录 主要内容 理论研究 整体模型 PQ计算模块 功率控制模块 PWM反馈模块 结果一览 下载链接 主要内容 该仿真针对微电网中分布式电源接入后产生的谐波影响,除了污染网络外,还会恶化微电网变流器输出电流,为了消除谐波影响&a…...
AI定义汽车/跨域融合/整车智能,汽车智能化2.0时代新机会来了
汽车智能化2.0,产业正在发生深度变革。 一方面,AI大模型开始在多个域同步赋能智能汽车,从智能座舱到智能驾驶,再到底盘域,AI大模型正在快速推动汽车变革为超级智能体,AI定义汽车时代开始来临。 另一方面&…...
(leetcode算法题)10. 正则表达式匹配
10. 正则表达式匹配 - 力扣(LeetCode) 此题的要求一个字符串 s 和一个字符规律 p之间支持 . 和 * 的正则表达式匹配 . 匹配任意单个字符 * 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串…...
SpringCloudAlibaba实战入门之Sentinel服务降级和服务熔断(十五)
一、Sentinel概述 1、Sentinel是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 一句话概括:sentinel即Hystrix的替代品,官网: https://sentinelguard.io/zh…...
使用爬虫技术获取网页中的半结构化数据
目录 前言1. 半结构化数据与爬虫技术简介1.1 半结构化数据的定义与特性1.2 爬虫技术的基本原理 2. 爬取半结构化数据的实现过程2.1 明确目标与准备2.2 发送HTTP请求2.3 解析网页内容2.4 动态内容的处理2.5 数据存储与清洗 3. 技术挑战与应对策略3.1 处理反爬机制3.2 提高爬取效…...
2025/1/1 路由期末复习作业二
呼呼呼祝大家元旦节快乐啦!(我顶着我超重的黑眼圈说) 昨天一个人在寝室一边吃泡面,一边看步步惊心,一边吃一边哭呜呜呜呜呜若曦为什么不和八爷在一起好好爱,就因为他不当皇帝蛮!难测最是帝王心…...
OpenCV-Python实战(13)——图像轮廓
一、找轮廓 cv2.findContours() contours,hierarchy cv2.findContours(image*,mode*,method*) contours:找到的所有轮廓数组,数组内的元素为轮廓像素点坐标。 hierarchy:轮廓间的层次关系。 image:二值图像(cv2.t…...
javascript变量
变量 命名规范 以 字母、数字、下划线、美元符号 $ 组成、不能以 数字开头、且不能使用 js 中的关键字。 命名规范推荐采用小驼峰 命名法 。类名 采用 大驼峰命名。 var 声明变量的特点 在 script 上下文中定义的是 全局变量,全局变量会自动称为 window的属性。 在…...
在K8S中,如何查看kubelet组件的日志?
在kubernetes中,查看Kubelet组件的日志可以通过几种不同的方法。以下是详细的步骤: 1. 使用journalctl命令: 如果kubelet是通过systemd方式部署,你可以使用journalctl命令来查看其日志。执行journalctl -u kubelet将显示Kubelet…...
android studio android sdk下载地址
android studio安装后,因为公司网络原因,一直无法安装android sdk 后经过手机网络,安装android sdk成功如下,也可以手动下载后指定android sdk本地目录 https://dl.google.com/android/repository/source-35_r01.zip https://dl…...
Fetch处理大模型流式数据请求与解析
为什么有的大模型可以一次返回多个 data? Server-Sent Events (SSE):允许服务器连续发送多个 data: 行,每个代表一个独立的数据块。 流式响应:大模型服务通常以流式响应方式返回数据,提高响应速度。 批量处理&#x…...
FPGA自学之路:到底有多崎岖?
FPGA,即现场可编程门阵列,被誉为硬件世界的“瑞士军刀”,其灵活性和可编程性让无数开发者为之倾倒。但谈及FPGA的学习难度,不少人望而却步。那么,FPGA自学之路到底有多崎岖呢? 几座大山那么高?…...
从0到机器视觉工程师(二):封装调用静态库和动态库
目录 静态库 编写静态库 使用静态库 方案一 方案二 动态库 编写动态库 使用动态库 方案一 方案二 方案三 总结 静态库 静态库是在编译时将库的代码合并到最终可执行程序中的库。静态库的优势是在编译时将所有代码包含在程序中,可以使程序独立运行&…...
[极客大挑战 2019]Knife1
这里很显然,根据提示可以猜测,已经有一句话木马上传了,但是路径这里不是很清楚,不知道路径在哪里,不过还是用菜刀连一下试试: 连接成功,在根目录下发现flag。不过如果不用菜刀,可以用…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
