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

C语言指针详解上

1 野指针

int main01(){//野指针就是没有初始化的指针,指针的指向是随机的,不可以 操作野指针//int  a = 0;//指针p保存的地址一定是定义过的(向系统申请过的)int  *p;//野指针*p = 200;printf("%d\n",*p);system("pause");return 0;}

2 空指针

空指针的作用: 如果使用完指针将指针赋值为NULL,在使用时判断一下指针是否为NULL,就知道指针有没有被使用

int main(){int  a;//将指针的值赋值为0,0x0000000 =  NULLint  *p = NULL;//给指针p的内容赋值为0*p = 200;//err  因为p保存了0x0000的地址,这个地址是不可以使用的,非法printf("%d\n",*p);system("pause");return 0;}

3 万能指针

万能指针就是可以保存任意的地址

//万能指针int main(){//void b; 不可以定义void类型的变量,因为编译器不知道给变量分配多大的空间//但是可以定义void *类型,因为指针都是4个字节int  a = 10;short b = 10;void *p = (void *)&a;//万能指针可以保存任意的地址void  *q = (void *)&b;//printf("%d\n", *p);//err  p是void*,不知道取几个字节的大小printf("%d\n",* (int *)p);// *(  (int *)地址)system("pause");return 0;}

4 const修饰的指针变量

int main(){int  a = 10;int  b = 20;//const修饰的是 * 还是变量p,//这里修饰的是*//const int  *p = &a;//不能通过 *p,改p所指向空间的内容//*p = 100; err  因为不能通过p改p所指向空间的内容//const修饰的变量p//p保存的地址不可以修改//int  * const p = &a;//p = &b;err  p本身的值不能被更改const  int *const p = &a;//p本身的指向不能改变,不能通过*p修改p//向那块空间的内容system("pause");return 0;}

5 多级指针

定义多级指针保存数据的地址时,定义的指针的类型只需要比要保持的数据的类型多一级*

//多级指针int main(){int a = 10;//*p  int a     int *pint *p = &a;//*q  int *p   int **qint **q = &p;//如果*和&相遇,相抵消// **q == *(*q) == *(p) ==  a//**q == *(*q) == *(&a) ==  aprintf("%d\n", **q);// *k  int **q  int ***kint ***k = &q;//*符号结合,代表这个k是一个指针变量//k是一个变量//k的类型,将变量k拖黑,剩下的类型//k用来保存谁的地址  将变量k和k最近的*一起拖黑,剩下什么类型//就保存什么类型数据的地址int *******************g;int ********************f = &g;system("pause");return 0;}

6 指针结合数组

指针加1,跨过一个步长

int  *p;步长  =  sizeof(int)要得到内存的数据,就该先得到数据的地址- (地址) 得到的是地址里面的内容int main(){//int  a[10] = {1,2,3,4,5,6,7,8,9,10};int  a[10] = { 0 };//a 数组名,首元素的地址int  *p = a;//指针p保存的是首元素的地址for (int i=0;i<sizeof(a)/sizeof(a[0]);i++){//printf("%d ",a[i]);//printf("%d ", *(p+i));*(p + i) = i;}for (int i = 0; i<sizeof(a) / sizeof(a[0]); i++){printf("%d ",a[i]);//printf("%d ", *(p+i));//*(p + i) = i;}system("pause");return 0;}

7 指针运算

两指针(类型一致)相减,得到的是中间跨过多少元素

两指针相加没有意义

int main(){int  a[10] = {1,2,3,4,5,6,7,8,9,10};//sizeof(int [10])int *p = a;//int  *q = (int *)(&a + 1) - 1;int  *q = &a[9];printf("%d\n",q-p);//  p+9 ==  qprintf("%d\n",*(p+3));//两指针相加没有意义// printf("%d\n", p+q);errsystem("pause");return 0;}

8 并不是数组的专属

[]==  *()int main(){//[] == *()int  a[10] = { 1,2,3,4,5,6,7,8,9,10 };int *p = a;for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++){//printf("%d ",a[i]);//a[i] == *(a+i)//printf("%d ", *(p+i));//printf("%d ", p[i]);// p[i]  == *(p+i)printf("%d ", *(a + i));}system("pause");return 0;}int main09(){//[]是不是数组的专属//int  a[10] = { 1,2,3,4,5,6,7,8,9,10 };//  []  ==  *()//p[0]   ==  *(p+0)int a = 10;int *p = &a;p[0] = 100;//p[1] = 200;printf("a=%d\n",a);system("pause");return 0;}

9 指针数组

整型数组 是一个数组,数组的每一个元素是整型

指针数组 是一个数组,数组的每一个元素都是一个指针

int main(){int a = 10;int b = 20;int c = 30;// int *p1 = &a  int *p2 = &a  int *p2 = &a//需求:  数组中的每一个元素都是指针(地址)int *num[3] = {&a,&b,&c};//printf("%d\n",sizeof(num));&a  ==  num[0]//for(int i=0;i<sizeof(num)/sizeof(num[0]);i++)//{// printf("%d\n",*num[i]);////}//定义一个指针用来保存数组num首元素的地址// num ==  &num[0] =   &(int *)  == int **//num[0]是int *类型,要保持int  *类型的地址,需要比它多一级*int **k = num;for (int i = 0; i < sizeof(num) / sizeof(num[0]); i++){printf("%d ",**(k+i));}system("pause");return 0;}

在这里插入图片描述

10 指针作为函数的形参

指针作为函数的形参,可以改变实参的值

void swap2(int*x, int *y){int  k = *x;*x = *y;*y = k;printf("x=%d y=%d\n", *x, *y);}int main(){int  a = 10;int b = 20;//swap(a,b);swap2(&a, &b);printf("a=%d b=%d\n", a, b);system("pause");return 0;}

在这里插入图片描述

11 数组作为函数的形参

//数组作为函数的形参会退化为指针//void print_arr(int b[10]) // int  *b//void print_arr(int b[1000])//int  *bvoid print_arr(int *b,int  len){int  n = sizeof(b) / sizeof(b[0]);  // *(b+0)  == *bprintf("n=%d\n",n);for (int i = 0; i <len; i++){printf("%d ",b[i]);}printf("\n");}int main(){int  a[10] = { 1,2,3,4,5,6,7,8,9,10 };print_arr(a,sizeof(a)/sizeof(a[0]));//打印数值的内容//  &a[0]   int *system("pause");return 0;}

12 指针作为函数的返回值

int num = 0;//在函数外面定义的变量叫全局变量,整个工程都可以使用//整个变量程序启动开辟空间,直到程序结束释放空间int * getnum(){//{}中定义的变量叫局部变量,局部变量在函数结束之后的空间会被释放srand(time(NULL));num = rand();return &num;//}int main(){int * p = getnum();printf("%d\n",*p);system("pause");return 0;}

相关文章:

C语言指针详解上

1 野指针 int main01(){//野指针就是没有初始化的指针,指针的指向是随机的,不可以 操作野指针//int a 0;//指针p保存的地址一定是定义过的(向系统申请过的)int *p;//野指针*p 200;printf("%d\n",*p);system("pause");return 0;}2 空指针 空指针的作用…...

力扣面试150题 | 27.移除元素

力扣面试150题 &#xff5c; 27.移除元素 题目描述解题思路代码实现复杂度分析 题目描述 27.移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必…...

JAVA 通过get,post访问远程接口

get请求 参数拼接在url &#xff1f;namevalue&sexvalue // httpurlhttp:127.0.0.1/project public static String doGet(String httpurl){HttpURLConnection connection nul&#xff1b;Inputstream is null;BufferedReader br null;String result null;//返回结果字…...

Spark例子

Spark例子 以下是一个简单的AI Spark例子&#xff1a; 假设我们有一个数据集&#xff0c;包含房屋大小、卧室数量和售价。我们想使用Spark来预测房屋售价。 首先&#xff0c;我们需要导入所需的库和数据。在这个例子中&#xff0c;我们将使用Pyspark。 python from pyspark…...

linux下ls和df卡死

1. strace看下卡在哪里 https://lokie.wang/article/43 strace ls strace df -h 2. 原因 https://segmentfault.com/a/1190000040620740 3. fuser 和 umount都不行&#xff0c;最后只能重启 重启机器还起不来了垃圾...

iOS(swiftui)——系统悬浮窗( 可在其他应用上显示,可实时更新内容)

因为ios系统对权限的限制是比较严格的,ios系统本身是不支持全局悬浮窗(可在其他app上显示)。在iphone14及之后的iPhone机型中提供了一个叫 灵动岛的功能,可以在手机上方可以添加一个悬浮窗显示内容并实时更新,但这个功能有很多局限性 如:需要iPhone14及之后的机型且系统…...

css弹窗动画效果,示例弹窗从底部弹出

从底部弹出来&#xff0c;有过渡动画效果 用max-height可以自适应内容的高度&#xff0c;当内容会超过最大高度时可以在弹窗里加个scroll-view 弹窗不能用v-if来隐藏&#xff0c;不然transition没效果&#xff0c;transition只能对已有dom元素起效果&#xff0c;所以用透明和v…...

STM32CubeIDE(CUBE-MX hal库)----RTC时钟,时钟实时显示

系列文章目录 STM32CubeIDE(CUBE-MX hal库)----初尝点亮小灯 STM32CubeIDE(CUBE-MX hal库)----按键控制 STM32CubeIDE(CUBE-MX hal库)----串口通信 STM32CubeIDE(CUBE-MX hal库)----定时器 STM32CubeIDE(CUBE-MX hal库)----蓝牙模块HC-05&#xff08;详细配置&#xff09; 前言…...

ubuntu 安装Nvidia驱动

官网下载 sudo bash NVIDIA。。。。。跟着b站机器人工匠阿杰即可。...

『亚马逊云科技产品测评』活动征文|基于亚马逊云EC2搭建PG开源数据库

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…...

【开题报告】基于J2EE的高校水电费管理系统的设计与实现

1.选题背景 随着高校规模的扩大和信息化建设的深入&#xff0c;学生宿舍的水电费管理成为一项复杂而重要的任务。传统的水电费管理方式通常依赖于人工操作&#xff0c;存在着管理效率低下、数据处理繁琐、费用统计不准确等问题。因此&#xff0c;设计和实现一款基于J2EE的高校…...

Revisiting Proposal-based Object Detection阅读笔记

Revisiting Proposal-based Object Detection阅读笔记 论文地址&#xff1a;link Abstract For any object detector, the obtained box proposals or queries need to be classified and regressed towards ground truth boxes. 对于任何物体检测器来说&#xff0c;获得的…...

Docker部署NFS服务

创建基础镜像 mkdir /data/nfs -p chmod 755 /data/nfs# NFS默认端口: 111、2049、20048 docker run -d \ --privileged \ --name nfs_server \ -p 111:111/tcp \ -p 111:111/udp \ -p 2049:2049/tcp \ -p 2049:2049/udp \ -p 30001-30005:30001-30005/tcp \ -p 30001-30005:3…...

深度学习TensorFlow2基础知识学习后半部分

介绍几个重要操作&#xff1a; 1.范数 a tf.fill([1,2], value2.) b tf.norm(a)# 二范数#第二种计算方法 # 计算验证 a tf.square(a) log("a的平方:", a) a tf.reduce_sum(a) log("a平方后的和:", a) b tf.sqrt(a) log("a平方和后开根号:"…...

电脑系统重装Win10专业版操作教程

用户想给自己的电脑重新安装上Win10专业版系统&#xff0c;但不知道具体的重装步骤。接下来小编将详细介绍Win10系统重新安装的步骤方法&#xff0c;帮助更多的用户完成Win10专业版的重装&#xff0c;重装后用户即可体验到Win10专业版系统带来的丰富功能。 准备工作 1. 一台正常…...

打包Python项目

打包Python项目 本教程将指导您如何打包一个简单的Python项目。它将 向您展示如何添加必要的文件和结构来创建包&#xff0c;如何 构建包&#xff0c;以及如何将其上传到Python包索引&#xff08;PyPI&#xff09;。 尖端 如果您在运行本教程中的命令时遇到问题&#xff0c;请…...

使用Python实现爬虫IP负载均衡和高可用集群

做大型爬虫项目经常遇到请求频率过高的问题&#xff0c;这里需要说的是使用爬虫IP可以提高抓取效率&#xff0c;那么我们通过什么方法才能实现爬虫IP负载均衡和高可用集群&#xff0c;并且能快速的部署并且完成爬虫项目。 通常在Python中实现爬虫ip负载均衡和高可用集群需要一…...

Jenkins+Maven+Gitlab+Tomcat 自动化构建打包,部署

环境准备 1、安装服务 Jenkins工具、环境、插件配置 全局变量配置 Manage Jenkins>tools>JDK 安装 安装插件 Deploy to container 安装此插件&#xff0c;才能将打好的包部署到tomcat上 配置国内mvn源 创建maven项目 1 2 3 4 5 6 7 8 9 10...

泰凌微(Telink)8258配置串口收发自定义数据

在官网下载SDK后&#xff08;以Mesh SDK为例&#xff09;使用Eclipse打开&#xff0c;对应MCU的配置文件在app_config_8258.h&#xff0c;默认的HCI接口是HCI_USE_NONE&#xff0c;如果改成HCI_USE_UART后可以通过串口收发数据&#xff0c;此时默认接收函数处理的是以Telink的协…...

入门低代码开发:快速构建应用程序的方法

一、什么是低代码 低代码开发是一种通过可视化建模和拖拽式设计工具来快速构建应用程序的方法。传统软件开发通常需要编写大量的代码&#xff0c;而低代码开发则提供了更高层次的抽象&#xff0c;使开发过程更加简单和高效。通过可视化界面&#xff0c;用户可以通过拖拽组件、配…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

PydanticAI快速入门示例

参考链接&#xff1a;https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...

react更新页面数据,操作页面,双向数据绑定

// 路由不是组件的直接跳转use client&#xff0c;useEffect&#xff0c;useRouter&#xff0c;需3个结合&#xff0c; use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...