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。不过如果不用菜刀,可以用…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...