C语言-指针初阶(6)

news2024/11/27 12:42:54

目录

思维导图:

1. 指针是什么?

2. 指针和指针类型 

2.1 指针+-整数

2.2 指针的解引用

3. 野指针

3.1 野指针成因

3.2 如何规避野指针

4. 指针运算

4.1 指针+-整数

4.2 指针-指针

4.3 指针的关系运算

5. 指针和数组

6. 二级指针

7. 指针数组

写在最后:


思维导图:

1. 指针是什么?

想了解指针,必须先了解内存是什么?

内存是计算机上的一种存储空间,程序运行时会载入内存,存储数据时也会申请内存。

而一个内存单元的大小是一个字节,每个内存单元都有自己的编号,而内存单元的编号被称为地址

在C语言中,地址也被称为指针。

总结:内存单元的编号 = 地址 = 指针

有关指针:

关于指针的大小:

2. 指针和指针类型 

2.1 指针+-整数

指针类型的意义:

例:

2.2 指针的解引用

指针类型决定了,指针进行解引用操作的时候,一次性访问几个字节,访问权限的大小

如果是char*的指针,解引用访问1个字节

如果是int*的指针,解引用访问4个字节

 所以,指针的访问是可以灵活运用的:

例:


#include <stdio.h>

int main()
{
	int a = 0x11223344;
	int* pa = &a;	
	*pa = 0;//一次性将四个字节初始化成零
	
	char* pc = &a;
	*pc = 0;//一次只将一个字节初始化成零

	return 0;
}

3. 野指针

野指针就是指针指向的位置是不可知的。

3.1 野指针成因

1. 指针未初始化

例:

int main()
{
	int* p;//未初始化
	*p = 20;
	return 0;
}

2. 指针越界访问

例:

#include <stdio.h>

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int* p = arr;
	int i = 0;
	for (i = 0; i <= 5; i++)
	{
		printf("%d ", arr[i]);//越界访问
	}
	return 0;
}

输出结果:

输出:1 2 3 4 5 -858993460(随机值)

3.2 如何规避野指针

1. 指针初始化

2. 小心指针越界

3. 指针指向空间释放,及时置NULL

4. 避免返回局部变量的地址

5. 指针使用之前检查有效性

例:

#include <stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;//指针的初始化

	int* p = NULL;//NULL - 空指针,专门用来初始化指针
	if (p != NULL)//使用前检查指针的有效性
	{
		;
	}
	return 0;
}

4. 指针运算

4.1 指针+-整数

例:

int main()
{
	int arr[n];
	int* p;
	for (p = &arr[0]; p < &arr[n];)
	{
		*p++ = 0;//先赋值再++,将数值arr中的值都初始化成0
	}            //每一次++都想后移一个整形
	return 0;
}

4.2 指针-指针

例:

#include <stdio.h>

int main()
{
	int arr[10] = { 0 };
	printf("%d\n", &arr[9] - &arr[0]);//指针相减的值是两个指针之间的元素个数

	return 0;
}

注:两个数组的指针之间是不能相加减的

应用:

模拟实现strlen函数:

#include <stdio.h>

my_strlen(char* arr)
{
	char* str = arr;
	while (* arr != '\0')
	{
		arr++;
	}
	return arr - str;//数组长度
}

int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);

	printf("%d\n", len);
	return 0;
}

输出结果:

输出:6

4.3 指针的关系运算

例:

#include <stdio.h>

#define n 5

int main()
{
	int arr[n];
	int* p;
	for (p = &arr[0]; p < &arr[n];)//这个其实就是指针之间的关系运算//p < &arr[n]
	{
		*p++ = 0;//先赋值再++,将数值arr中的值都初始化成0
	}            //每一次++都想后移一个整形
	return 0;
}

5. 指针和数组

用指针打印数组:

例:

#include <stdio.h>
int main()
{
	int arr[10] = {0};
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;

	//给数组赋值
	for (i = 0; i < sz; i++)
	{
		*(p + i) = i + 1;//通过指针访问数组的每一个元素
	}

	//打印数组
	for (i = 0; i < sz; i++)
	{
		//printf("%d ", arr[i]);
		printf("%d ", *(arr + i));//这两种打印方式是一模一样的
	}
	return 0;
}

输出结果:

输出:1 2 3 4 5 6 7 8 9 10

6. 二级指针

例:

#include <stdio.h>

int main()
{
	int a = 0;
	int* pa = &a;//pa是一级指针变量
	int** ppa = &pa;//ppa是二级指针变量
	**ppa = 50;
	printf("%d\n", **ppa);
	printf("%d\n", a);
	return 0;
}

输出结果:

输出:
50
50

当然如果你想创建三级指针变量,规则也是一样的。

7. 指针数组

指针数组是什么?

指针数组是数组(数组是主语),就比如:好孩子是孩子(孩子是主语)(主语在后面)

例:

#include <stdio.h>

int main()
{	//我们可以使用一维数组,模拟一个二维数组
	int a[] = { 1,2,3,4 };
	int b[] = { 2,3,4,5 };
	int c[] = { 3,4,5,6 };
	int* arr[3] = { a,b,c };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{	//通过i访问arr
		for (j = 0; j < 4; j++)
		{	//通过j访问a b c
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

输出结果:

输出:
1 2 3 4
2 3 4 5
3 4 5 6

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

50行Python代码实现自动下载小说,并打包exe直接

前言 室友喊着没有小说看&#xff0c;让我给他推荐几本&#xff0c;这能难倒我&#xff1f; 分分钟就用python给他把整个网站的小说都给下载下来了&#xff0c;不愧是我啊&#xff01; 话不多说&#xff0c;我们直接开整&#xff01; &#xff08;文末送读者福利&#xff09…

python之爬虫的学习

python爬虫入门-1为什么要学习爬虫浏览器背后的秘密常用网络请求URL解析HTTP常见响应状态码相关库及其简单使用相关引用综合栗子为什么要学习爬虫 现如今&#xff0c;浏览器可以更方便的进行网页交互以人们适合阅读的方式展示数据&#xff1b;但爬虫或者网页抓取对数据的收集和…

第5章 输入/输出(I/O)管理

5.1 I/O管理概述 5.1.1 I/O设备 I/O设备的分类&#xff08;按使用特性分类&#xff09;I/O设备的分类&#xff08;按传输速率分类&#xff09;I/O设备的分类&#xff08;按信息交换的单位分类&#xff09; 5.1.2 I/O控制方式 有4种&#xff1a; 1. 程序直接控制方式2. 中…

都是同样条件的mysql select语句,为什么读到的内容却不一样?

假设当前数据库里有下面这张表。 老规矩&#xff0c;以下内容还是默认发生在innodb引擎的可重复读隔离级别下。 大家可以看到&#xff0c;线程1&#xff0c;同样都是读 age > 3 的数据。第一次读到1条数据&#xff0c;这个是原始状态。这之后线程2将id2的age字段也改成了3。…

kubelet源码 删除pod(二)

kubelet源码 删除pod&#xff08;二&#xff09; 本文中含有k8s的一个bug&#xff0c;我也正在努力提交PR&#xff0c;不过会不会被merge就不清楚了。 kubernetes PR地址 pod_workers.go是主要处理pod变化的文件&#xff0c;在1.22版本后对这个文件进行了比较大的修改。把属…

[附源码]SSM计算机毕业设计基于SSM的酒店管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

QT 字符串操作常用接口函数

目录常见字符串处理函数空白字符串处理函数查询字符串数据字符串比较字符串的转换QT版本的STLQLinkedList和QVector的区别QT提供的STL命名风格的迭代器QMap和QHash经过该简单设置可以防止msvc环境下使用qdebug打印输出时出现中文乱码的问题。 #include "learn.h" #i…

长话短说:学习网络安全自学好还是报培训班?

无论你是大学生还是在职人员&#xff0c;想学网络安全时&#xff0c;都会面临两个选择&#xff0c;自学或者报班。报班通常太费钱&#xff0c;时间又不自由&#xff1b;自学又不知道如何下手&#xff0c;担心自己坚持不下来。怎么办&#xff1f; 我们先分析一下自学和培训班的…

【文本分类】《融合注意力和剪裁机制的通用文本分类模型》

阅读摘要&#xff1a;   针对实际场景中长短文本大量的情况&#xff0c;提出了双通道注意力机制与长文本裁剪机制来改进文本分类模型&#xff0c;最终提高了精度。 参考文献&#xff1a;   [1] 融合注意力和剪裁机制的通用文本分类模型 参考论文信息 论文名称&#xff1a;《…

第三版全球干旱指数和潜在蒸散数据发布

Robert J. Zomer &#xff1b;JianchuXu&#xff1b;AntonioTrabucco(Kunming Institute of Botany, Chinese Academy of Science&#xff1b;Euro-Mediterranean Center on Climate Change, IAFES Division, Sassari, Italy) 摘要 潜在蒸散(Potential evapotranspiration&…

Linux Shell 自动交互功能实现

1. EOF 多文本输入 需求案例 1 新交付了一批机器&#xff0c;每台机器只分配了一块落盘 &#xff0c;现在根据需求对该盘进行分区并实现挂载&#xff0c;如何实现&#xff1f; 需求分析&#xff1a; 对于一个盘&#xff0c;实现分区挂载到不同目录&#xff0c;通常思路有两…

灯具行业MES解决方案,实现产品的正反向追溯

灯具照明行业产业链主要包括上游原材料、中游照明产品生产及封装、下游照明细分应用领域。产业链上游、中游多为资本密集与技术密集型行业&#xff0c;产品高度标准化&#xff0c;市场相对集中。而产业链下游产品需求相对个性化&#xff0c;多品类、多SKU&#xff0c;市场集中度…

探索性数据分析

有目的性的探索数据集以获取具体的优化方向和思路。 Intuition 探索性数据分析 (EDA) 以了解数据集的信号和细微差别。这是一个循环过程&#xff0c;可以在开发过程的各个阶段&#xff08;标记之前/之后、预处理等&#xff09;完成&#xff0c;具体取决于问题的定义程度。例如&…

【Proteus仿真】【STM32单片机】蔬菜大棚温湿度控制系统设计

文章目录一、主要功能二、硬件资源三、软件设计四、实验现象联系作者一、主要功能 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD1602液晶、DHT11温湿度、蜂鸣器、按键、LED、继电器、电机模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示DH…

setup获取props和自定义事件、通过expose暴露给ref获取属性和方法、setup顶层async、setup返回函数

文章目录1. setup获取props和自定义事件2. 通过expose暴露给ref获取属性和方法3. setup顶层async4. setup返回函数1. setup获取props和自定义事件 child 组件&#xff1a; <template><div><h3>我是child组件 -- {{ title }}</h3><button click&qu…

We have awesome remote U.S. jobs waiting for engineers like you.

发件人&#xff1a;Turing - U.S. Software Jobs <hiringturing.com> Hi I saw your profile online and wanted to reach out! You might be a great fit for many high-paying remote U.S. software engineering opportunities on Turing.com. Turing is based in …

steam搬砖,长期稳定副业,附防坑指南助你不掉坑

大家伙&#xff0c;我是阿阳 今天给大家拆解一个冷门项目&#xff0c;国外steam游戏搬砖项目&#xff0c;这个项目也是自己正在做的第二个项目&#xff0c;虽然冷门&#xff0c;不暴利&#xff0c;做了这么久赚钱一直很稳定。站在一个搞钱人的角度来说&#xff0c;这个项目作为…

Docker部署单节点Kafka

文章目录Docker部署单节点Kafka参考镜像wurstmeister/zookeeper Overviewwurstmeister/kafka Overview部署单Brokerkafka 环境变量&#xff1a;启动与停止命令测试验证&#xff1a;参考文章Docker部署单节点Kafka 参考镜像 wurstmeister/zookeeper Overview docker pull wur…

Hadoop总结——HDFS

一、HDFS概述 1.1 HDFS产生背景 随着数据量越来越大&#xff0c;在一个操作系统管辖的范围内存不下了&#xff0c;那么就分配到更多的操作系统管理的磁盘中&#xff0c;但是不方便管理和维护&#xff0c;迫切需要一种系统来管理多台机器上的文件&#xff0c;这就是分布式文件…

记一次自定义starter引发的线上事故复盘

前言 本文素材来源于业务部门技术负责人某次线上事故复盘分享。故事的背景是这样&#xff0c;该业务部门招了一个技术挺不错的小伙子小张&#xff0c;由于小张技术能力在该部门比较突出&#xff0c;在入职不久后&#xff0c;他便成为这个部门某个项目组的team leader&#xff…