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 =  NULL

int  *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 *p

int *p = &a;

//*q  int *p   int **q

int **q = &p;

//如果*和&相遇,相抵消

// **q == *(*q) == *(p) ==  a

//**q == *(*q) == *(&a) ==  a

printf("%d\n", **q);

// *k  int **q  int ***k

int ***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 ==  q

printf("%d\n",*(p+3));

//两指针相加没有意义

// printf("%d\n", p+q);err

system("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  *b

void print_arr(int *b,int  len)

{

int  n = sizeof(b) / sizeof(b[0]);  // *(b+0)  == *b

printf("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;

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring 源码】 贯穿 Bean 生命周期的核心类之 AbstractAutowireCapableBeanFactory

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

C++【智能指针】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;为什么需要智能指针&#x…

java学习part40collections工具类

162-集合框架-Collections工具类的使用_哔哩哔哩_bilibili 1.collections工具类 感觉类似c的algorithm包&#xff0c;提供了很多集合的操作方法 2.排序 3.查找 4.复制替换 5.添加&#xff0c;同步

异常检测 | 基于孤立森林(Isolation Forest)的数据异常数据检测(结合t-SNE降维可视化)

异常检测 | MATLAB实现基于孤立森林的数据异常检测 目录 异常检测 | MATLAB实现基于孤立森林的数据异常检测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于孤立森林(Isolation Forest)的数据异常数据检测可视化&#xff08;完整源码和数据) 基于孤立森林(…

如何将微服务注册到nacos服务上

首先可在maven的父工程的pom文件中添加maven的dependencyManagement标签&#xff0c;引入spring-cloud-alibaba-dependencies坐标 <properties><spring.cloud.alibaba.version>2.2.9.RELEASE</spring.cloud.alibaba.version></properties><!-- 管理…

Leetcode刷题笔记题解(C++):LCR 121. 寻找目标值 - 二维数组

思路&#xff1a;从左小角或者右上角开始遍历&#xff0c;假设右上角开始遍历&#xff0c;如果当前值大于目标值则列-1&#xff1b;如果当前值小于目标值则行1&#xff0c;以此遍历来查找目标值&#xff1b;注意col和row的选取 class Solution { public:bool findTargetIn2DPl…

【Java数据结构 -- List和ArrayList与顺序表】

List和ArrayList与顺序表 一. List1.1 List介绍2.1 常见接口介绍3.1 List的使用 二. ArrayList与顺序表1.线性表2.顺序表2.1 接口的实现 3.ArrayList简介4. ArrayList使用4.1 ArrayList的构造 4.2 ArrayList常见操作4.3 ArrayList的遍历4.4 ArrayList的扩容机制5. ArrayList的具…

HarmonyOS 振动效果开发指导

Vibrator 开发概述 振动器模块服务最大化开放硬工最新马达器件能力&#xff0c;通过拓展原生马达服务实现振动与交互融合设计&#xff0c;打造细腻精致的一体化振动体验和差异化体验&#xff0c;提升用户交互效率和易用性、提升用户体验、增强品牌竞争力。 运作机制 Vibrato…

排序:快速排序(hoare版本)

目录 快速排序&#xff1a; 概念&#xff1a; 动画分析&#xff1a; 代码实现&#xff1a; 代码分析&#xff1a; 代码特性&#xff1a; 常见问题&#xff1a; 快速排序&#xff1a; 概念&#xff1a; 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&a…

ESP32-Web-Server编程- 在 Web 上开发动态纪念册

ESP32-Web-Server编程- 在 Web 上开发动态纪念册 概述 Web 有很多有趣的玩法&#xff0c;在打开网页的同时送她一个惊喜。 需求及功能解析 本节演示在 ESP32 上部署一个 Web&#xff0c;当打开对应的网页时&#xff0c;将运行动态的网页内容&#xff0c;显示炫酷的纪念贺词…

对Spring源码的学习:二

目录 SpringBean实例化流程 Spring的后处理器 Bean工厂后处理器 SpringBean实例化流程 Spring容器在进行初始化时&#xff0c;会将xml配置的<bean>的信息封装成一个BeanDefinition对象&#xff0c;所有的BeanDefinition存储到一个名为beanDefinitionMap的Map集合中去…

2023.12.6 关于 Spring Boot 事务的基本概念

目录 事务基本概念 前置准备 Spring Boot 事务使用 编程式事务 声明式事务 Transactional 注解参数说明 Transational 对异常的处理 解决方案一 解决方案二 Transactional 的工作原理 面试题 Spring Boot 事务失效的场景有那些&#xff1f; 事务基本概念 事务指一…

基于深度学习的遥感图像变化差异可视化系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 遥感图像变化差异可视化是遥感图像处理和分析的重要研究领域之一。随着遥感技术的快速发展和遥感数据的广泛应用&#xff0c;遥感图像的获取和处理变得越来越容易…

Javaweb | Servlet编程

目录: 1.认识Servlet2.编写Servlet3.Servlet的运行机制4.Servlet的生命周期4.1 Servlet生命周期图init()方法doGet()doPost()service()destroy()方法 5.解决“控制台”打印中文乱码问题6.Servlet 和 JSP内置对象 (常用对象)获得out对象获得request 和 response对象获得session对…

KeePass开源密码管理器

KeePass开源密码管理器 KeePass 是一款免费的开源密码管理器&#xff0c;KeePass 将密码存储为一个数据库&#xff0c;而这个数据库由一个主密码或密码文件锁住&#xff0c;也就是说我们只需要记住一个主密码&#xff0c;或使用一个密码文件&#xff0c;就可以解开这个数据库&a…

每日一题:LeetCode-11.盛水最多的容器

每日一题系列&#xff08;day 13&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

服务器安装JDK17 版本显示JDK8

服务器之前安装的是JDK8&#xff0c;后面升级JDK17后&#xff0c;发现执行 java -vsrsion 显示的是此时我的环境变量已经换成了JAVA17的路径 输入&#xff1a; vim /etc/profile 解决办法&#xff1a; 1.更新自己环境变量 bash export JAVA_HOME/usr/local/jdk-17.0.7 …

【科普】什么是电子印章? PS抠的印章能用吗?

各类扣章教程一搜一大堆&#xff0c;说明大家对于电子印章使用需求很高。不过要谨记&#xff0c;不要随便抠印章用于公文、证明书、合同协议、收据发票等电子文件&#xff0c;否则可能会吃牢饭。 单是一张电子化的图片是不具备合法性的。那有的人就要问了&#xff0c;我见到的…

读书笔记-《数据结构与算法》-摘要4[插入排序]

插入排序 核心&#xff1a;通过构建有序序列&#xff0c;对于未排序序列&#xff0c;在已排序序列中从后向前扫描(对于单向链表则只能从前往后遍历)&#xff0c;找到相应位置并插入。实现上通常使用in-place排序(需用到O(1)的额外空间) 从第一个元素开始&#xff0c;该元素可…

【微服务】springboot整合quartz使用详解

目录 一、前言 二、quartz介绍 2.1 quartz概述 2.2 quartz优缺点 2.3 quartz核心概念 2.3.1 Scheduler 2.3.2 Trigger 2.3.3 Job 2.3.4 JobDetail 2.4 Quartz作业存储类型 2.5 适用场景 三、Cron表达式 3.1 Cron表达式语法 3.2 Cron表达式各元素说明 3.3 Cron表达…