当前位置: 首页 > news >正文

C语言----指针

目录

1.概念

2.格式

3.指针操作符

4.初始化

1. 将普通变量的地址赋值给指针变量

a. 将数组的首地址赋值给指针变量

b. 将指针变量里面保存的地址赋值给另一个指针变量

5.指针运算

5.1算术运算

5.2 关系运算

指针的大小

总结:

段错误

指针修饰

1. const修饰

2. void

大小端

二级指针

指针和数组

1. 指针和一维数组

直接访问:

间接访问:

2. 指针和二维数组

直接访问:

间接访问:

数组指针

数组指针

定义:本质是指针,指向的是数组(又称行指针)

格式:存储类型数据类型(*指针变量名)[列数];

大小


指针的优点:

  1. 使程序更加简洁、紧凑、高效
  2. 有效的表达更复杂的数据结构
  3. 动态分配内存
  4. 得到多余一个数的函数的返回值

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 = &num;

*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 = &num;

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 关系运算 指针的大小 总结&#xff1a; 段错误 指针修饰 1. con…...

树莓派之旅-在wsl-x86-64 上进行树莓派的交叉编译

前情提要&#xff1a; 想把自己花里胡哨的终端丢到树莓派上去&#xff0c;可是树莓派算力不够&#xff0c;编译时间过于漫长 交叉编译 定义网上有&#xff0c;懒得复制了&#xff0c;大概就是在本机电脑上编译目标平台的可执行文件 这里的目标平台是树莓派 使用 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天&#xff0c;希望自己能够…...

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如何添加任务列表-复选框的添加&#x1f448;点击这里也可查看 前言 To-do任务列表是一种很常见的时间管理工具&#xff0c;它适用于工作计划&…...

基于下垂控制的构网变换器功率控制【微电网变流器】【Simulink】

目录 主要内容 理论研究 整体模型 PQ计算模块 功率控制模块 PWM反馈模块 结果一览 下载链接 主要内容 该仿真针对微电网中分布式电源接入后产生的谐波影响&#xff0c;除了污染网络外&#xff0c;还会恶化微电网变流器输出电流&#xff0c;为了消除谐波影响&a…...

AI定义汽车/跨域融合/整车智能,汽车智能化2.0时代新机会来了

汽车智能化2.0&#xff0c;产业正在发生深度变革。 一方面&#xff0c;AI大模型开始在多个域同步赋能智能汽车&#xff0c;从智能座舱到智能驾驶&#xff0c;再到底盘域&#xff0c;AI大模型正在快速推动汽车变革为超级智能体&#xff0c;AI定义汽车时代开始来临。 另一方面&…...

(leetcode算法题)10. 正则表达式匹配

10. 正则表达式匹配 - 力扣&#xff08;LeetCode&#xff09; 此题的要求一个字符串 s 和一个字符规律 p之间支持 . 和 * 的正则表达式匹配 . 匹配任意单个字符 * 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s 的&#xff0c;而不是部分字符串…...

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 路由期末复习作业二

呼呼呼祝大家元旦节快乐啦&#xff01;&#xff08;我顶着我超重的黑眼圈说&#xff09; 昨天一个人在寝室一边吃泡面&#xff0c;一边看步步惊心&#xff0c;一边吃一边哭呜呜呜呜呜若曦为什么不和八爷在一起好好爱&#xff0c;就因为他不当皇帝蛮&#xff01;难测最是帝王心…...

OpenCV-Python实战(13)——图像轮廓

一、找轮廓 cv2.findContours() contours,hierarchy cv2.findContours(image*,mode*,method*) contours&#xff1a;找到的所有轮廓数组&#xff0c;数组内的元素为轮廓像素点坐标。 hierarchy&#xff1a;轮廓间的层次关系。 image&#xff1a;二值图像&#xff08;cv2.t…...

javascript变量

变量 命名规范 以 字母、数字、下划线、美元符号 $ 组成、不能以 数字开头、且不能使用 js 中的关键字。 命名规范推荐采用小驼峰 命名法 。类名 采用 大驼峰命名。 var 声明变量的特点 在 script 上下文中定义的是 全局变量&#xff0c;全局变量会自动称为 window的属性。 在…...

在K8S中,如何查看kubelet组件的日志?

在kubernetes中&#xff0c;查看Kubelet组件的日志可以通过几种不同的方法。以下是详细的步骤&#xff1a; 1. 使用journalctl命令&#xff1a; 如果kubelet是通过systemd方式部署&#xff0c;你可以使用journalctl命令来查看其日志。执行journalctl -u kubelet将显示Kubelet…...

android studio android sdk下载地址

android studio安装后&#xff0c;因为公司网络原因&#xff0c;一直无法安装android sdk 后经过手机网络&#xff0c;安装android sdk成功如下&#xff0c;也可以手动下载后指定android sdk本地目录 https://dl.google.com/android/repository/source-35_r01.zip https://dl…...

Fetch处理大模型流式数据请求与解析

为什么有的大模型可以一次返回多个 data&#xff1f; Server-Sent Events (SSE)&#xff1a;允许服务器连续发送多个 data: 行&#xff0c;每个代表一个独立的数据块。 流式响应&#xff1a;大模型服务通常以流式响应方式返回数据&#xff0c;提高响应速度。 批量处理&#x…...

FPGA自学之路:到底有多崎岖?

FPGA&#xff0c;即现场可编程门阵列&#xff0c;被誉为硬件世界的“瑞士军刀”&#xff0c;其灵活性和可编程性让无数开发者为之倾倒。但谈及FPGA的学习难度&#xff0c;不少人望而却步。那么&#xff0c;FPGA自学之路到底有多崎岖呢&#xff1f; 几座大山那么高&#xff1f;…...

从0到机器视觉工程师(二):封装调用静态库和动态库

目录 静态库 编写静态库 使用静态库 方案一 方案二 动态库 编写动态库 使用动态库 方案一 方案二 方案三 总结 静态库 静态库是在编译时将库的代码合并到最终可执行程序中的库。静态库的优势是在编译时将所有代码包含在程序中&#xff0c;可以使程序独立运行&…...

[极客大挑战 2019]Knife1

这里很显然&#xff0c;根据提示可以猜测&#xff0c;已经有一句话木马上传了&#xff0c;但是路径这里不是很清楚&#xff0c;不知道路径在哪里&#xff0c;不过还是用菜刀连一下试试&#xff1a; 连接成功&#xff0c;在根目录下发现flag。不过如果不用菜刀&#xff0c;可以用…...

卷积神经网络(CNN)原理可视化解释:Phi-4-mini-reasoning担任AI讲师

卷积神经网络&#xff08;CNN&#xff09;原理可视化解释&#xff1a;Phi-4-mini-reasoning担任AI讲师 1. 当AI成为你的机器学习导师 想象一下&#xff0c;有位从不疲倦的讲师&#xff0c;能用最生动的比喻解释复杂的算法原理&#xff0c;还能实时生成配套示意图——这就是Ph…...

Windows下用CMake和VS编译gRPC 1.72.0,我踩过的那些坑(附完整依赖库列表)

Windows平台下gRPC 1.72.0编译实战&#xff1a;从CMake配置到VS链接错误的系统化解法 最近在Windows平台上手动编译gRPC 1.72.0的经历可谓是一波三折。作为一个长期在Linux环境下工作的开发者&#xff0c;这次回到Windows平台进行gRPC编译&#xff0c;遇到了不少特有的挑战。本…...

成都宠博会的发展历程

1.背景与起源创办背景&#xff1a;随着国内宠物经济的蓬勃发展&#xff0c;成都以其浓厚的宠物文化和“宠物友好城市”的定位&#xff0c;为宠博会的诞生提供了沃土。展会旨在满足中西部地区日益增长的行业交流与消费需求。首届信息&#xff1a;根据文档提及的“从2012年到2025…...

连国家药监局都重磅发文!AI + 药品监管落地方向,学AI刻不容缓!

4 月 2 日&#xff0c;国家药监局正式发布《关于 “人工智能 药品监管” 的实施意见》&#xff0c;明确要把 AI 技术深度融入药品全生命周期监管&#xff0c;给行业带来新一轮数智化升级信号。作为关注医药行业的学长&#xff0c;今天用清晰易懂的方式&#xff0c;把这份文件的…...

<数据集>yolo骑行者识别<目标检测>

数据集下载链接https://blog.csdn.net/qq_53332949/article/details/159770308?spm1011.2415.3001.5331数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13674张 标注数量(xml文件个数)&#xff1a;13674 标注数量(txt文件个数)&#xff1a;13674 标注类别数&…...

如何构建LaTeX-Workshop的自动化测试与持续集成流程:开发者完整指南

如何构建LaTeX-Workshop的自动化测试与持续集成流程&#xff1a;开发者完整指南 【免费下载链接】LaTeX-Workshop Boost LaTeX typesetting efficiency with preview, compile, autocomplete, colorize, and more. 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX-Worksh…...

DLSS Swapper:3步解锁游戏性能倍增的AI优化工具

DLSS Swapper&#xff1a;3步解锁游戏性能倍增的AI优化工具 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为PC游戏玩家设计的深度学习超级采样(DLSS)版本管理工具&#xff0c;通过智能环境诊断、…...

OpenClaw飞书机器人配置指南:Qwen3-14b_int4_awq实现对话触发任务

OpenClaw飞书机器人配置指南&#xff1a;Qwen3-14b_int4_awq实现对话触发任务 1. 为什么选择OpenClaw飞书机器人组合&#xff1f; 去年我接手了一个小团队的内部工具优化项目&#xff0c;需要解决两个核心痛点&#xff1a;一是团队成员频繁在飞书群内重复询问相同问题&#x…...

SEO_网站SEO排名下降的五大原因及应对技巧

SEO:网站SEO排名下降的五大原因及应对技巧 在数字营销的世界里&#xff0c;网站的SEO排名对于吸引流量和提升业务是至关重要的。随着搜索引擎算法的不断更新&#xff0c;很多网站会经历SEO排名下降的困境。本文将详细探讨网站SEO排名下降的五大原因&#xff0c;并提供相应的应…...

引爆企业降本增效的AI革命!生成式AI应用专家亲授,从字节跳动到华为的数字化转型实战秘籍!

本文介绍了资深AI专家Mr. Li在生成式AI应用与数字化转型领域的丰富经验&#xff0c;涵盖其在华为、字节跳动等企业的实践经历&#xff0c;以及在多个国家级标准制定和央企数字化转型项目中的参与。Mr. Li提供了一系列关于生成式AI和企业数字化转型的精品课程&#xff0c;旨在帮…...