【C生万物】 指针篇 (进级) 00

news2024/10/7 13:17:02

 欢迎来到 Claffic 的博客 💞💞💞                               👉 专栏:《C生万物 | 先来学C》👈

前言:

前面已经带大家学习了初级的指针,先回顾一下重点:指针是用来存放地址的变量;指针的大小是4/8字节;指针类型决定了指针+-整数的步长和指针解引用的权限。这期继续探讨指针,相信你会有更加深入的理解。


目录

Part1:字符指针 

Part2:指针数组

Part3:数组指针

1.定义

2.&数组名与数组名

3.使用


Part1:字符指针 

我们知道指针是有类型的,其中一种是字符指针类型 char* 

❓那么字符指针是如何指向字符的呢?接下来带大家探讨:

一般的使用:

int main()
{
	char ch = 'e';
	char* pc = &ch;
	*pc = 'e';

	return 0;
}

这种就是指针 pc 指向 字符 e

还有一种使用方法: 

int main()
{
	const char* pstr = "Hello world";
	printf("%s\n", pstr);

	return 0;
}

👁️‍🗨️运行结果:

❓提问:pstr 是指向 Hello world 整体吗?

实际上并不是的

而是把字符串  Hello world 的首字母 H 的地址存放到 pstr 中了:

下面有一道题,以加深理解: 

int main()
{
	char str1[] = "Hello world";
	char str2[] = "Hello world";
	const char* str3 = "Hello world";
	const char* str4 = "Hello world";

	if (str1 == str2)
		printf("str1 and str2 are same\n");
	else
		printf("str1 and str2 are not same\n");

	if (str3 == str4)
		printf("str3 and str4 are same\n");
	else
		printf("str3 and str4 are not same\n");

	return 0;
}

👁️‍🗨️输出结果:

解释:

str1 和 str2 是分别开辟的两个数组,用相同的常量字符串去初始化两个数组,也是会开辟出不同的内存块。所以 str1 与 str2 不同。

C/C++会把常量字符串存储到单独的一个内存区域,str3 和 str4 指向的就是同一个常量字符串,所以 str3 和 str4 相同。

Part2:指针数组

这一部分在指针初级提到了,这里回顾一下:

指针数组本质是什么?

答:数组。

以下的指针数组是什么意思?

int* arr1[3]; 
char* arr2[2]; 
char** arr3[1];

答:

int* arr1[3];      --- 存放一级整型指针的数组
char* arr2[2];   --- 存放一级字符指针的数组
char** arr3[1];  --- 存放二级字符指针的数组

Part3:数组指针

1.定义

接上文的指针数组,这里有蹦出个数组指针,

老样子,先回答:数组指针是数组还是指针?

答:指针

我们已经知道整型指针指向整型,浮点型指针指向浮点型,

那么数组指针就是指向数组的指针

需要明确的就是它的表示方式:

int* p1[10];  // 这是一个指针数组
int(*p2)[10]; // 这是一个数组指针

数组指针相比指针数组的区别就是多了个括号 ( ) 

解释:

• p 先和 * 结合,说明 p 是一个指针变量,然后指着指向的是一个大小为 10 个整型的数组。所以 p 是一    个指针,指向一个数组,叫数组指针。

• [ ]的优先级要高于*号的,所以必须加上 ( ) 来保证p先和*结合。 

2.&数组名与数组名

先给你一个数组:

int arr[10];

问: arr &arr 分别是啥?

让计算机告诉我们:

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", &arr);

	return 0;
}

👁️‍🗨️运行结果:

这两个结果是一样的欸,

真正如此吗?

再来看下面这一段代码:

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("arr = %p\n", arr);
	printf("&arr= %p\n", &arr);
	printf("arr+1 = %p\n", arr + 1);
	printf("&arr+1= %p\n", &arr + 1);

	return 0;
}

 👁️‍🗨️运行结果:

看到没有,arr&arr+1不同,即步长不同,可以断定 &数组名与数组名意义不同

&arr 表示的是数组的地址,而不是数组首元素的地址

3.使用

学会了数组指针,终究是要运用的,那么数组指针是如何使用的呢?

数组指针指向的是数组,那么数组指针中存放的就是该数组的地址:

以下代码是存放一个数组的地址:

#include <stdio.h>
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int(*p)[10] = &arr;//把数组arr的地址赋值给数组指针变量p

	return 0;
}

不过很少这样使用,多数是应用在函数传参当中:

void print_arr(int(*arr)[3], int row, int col) // 形参1是数组指针
{
	int i = 0,j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}

int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8 };
	print_arr(arr, 3, 3);

	return 0;
}

 👁️‍🗨️运行结果:

 

你知道么,向 print_arr 传递的 arr 是二维数组第一行的地址,也就是一维数组的地址。

来,回顾一下,判断以下代码分别表示什么:

int arr[5];
int* parr1[10];
int(*parr2)[10];

还是简单的,

 int arr[5] 表示数组,

 int* parr1[10] 表示指针数组,

 int(*parr2)[10] 表示数组指针。

没意思?那这个呢?

int (*parr3[5])[3];

答:数组指针数组

解释:

( ) 内的优先,先看括号内的:

[ ] 的优先级高于 * ,parr3 先与 [ ] 结合,则 parr3 是一个数组,该数组有5个元素,

那么存放的元素是什么类型呢? 是 int(*)[3] ,也就是数组指针 

图示: 

 


总结: 

这篇博客先到这里,主要讲了字符指针,数组指针,指针数组,到这里还没完,下期接着讲解指针进级,不过要先消化好这一篇哦 ~

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗

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

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

相关文章

数据库sql语句(视图的创建)

例题&#xff1a; 建表&#xff1a;要注意各表之间的索引联系&#xff0c;建表先后顺序很重要&#xff0c;不然建不了&#xff0c;例如先建dept&#xff0c;在建其他表&#xff0c;先在dept插入数据&#xff0c;再在其他表插入数据 &#xff08;1&#xff09; create table …

SW simulation解算器选取

接下来重点介绍以下4种解算器&#xff0c;并对解算器进行实际的计算测试。1)Direct sparse解算器&#xff1a;稀疏矩阵解算器&#xff0c;目前使用最为广泛也是发展最为成熟的解算器&#xff0c;几乎所有的有限元分析软件都有该解算器。它可以用于大多数计算模型&#xff0c;堪…

<IBM> 《HA网卡确认方法》

《HA网卡确认方法》 1 HA IP地址类型2HA IP地址设置原则3 HA网卡日常查看方法3.1 查看hosts文件3.2 查看网卡和IP 4 通过命令方式直接查看5 直接查看HA配置4 HA网卡SMIT查看方法&#xff08;暂不完整&#xff09;4.1 根据hosts文件确认IP对应的别名4.2 根据serviceIP确认Persis…

Django SQL注入漏洞分析(CVE-2022-28346)

漏洞简介 Django 在2022年发布的安全更新&#xff0c;修复了在 QuerySet 的 annotate()&#xff0c; aggregate()&#xff0c; extra() 等函数中存在的 SQL 注入漏洞。 影响版本 2.2< Django Django <2.2.28 3.2< Django Django ❤️.2.13 4.0< Django Django &…

白盒测试的静态和动态

白盒测试的静态和动态 静态白盒测试 检查设计和代码 静态测试是指测试非运行部分——检查和审查。白盒测试是指访问代码&#xff0c;能够查看和审查。静态白盒测试实在不执行的条件下有条理地仔细审查软件设计、体系结构和代码&#xff0c;从而找出软件缺陷的过程。有时也称为结…

SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler实现全局异常捕获与处理

场景 在编写Controller接口时&#xff0c;为避免接口因为未知的异常导致返回不友好的结果和提示。 如果不进行全局异常捕获则需要对每个接口进行try-catch或其他操作。 可以对Controller进行全局的异常捕获和处理&#xff0c;一旦发生异常&#xff0c;则返回通用的500响应码与…

洁净环境GMP 要求悬浮粒子 浮游菌 高效过滤器检漏验证所需仪器

lighthouse尘埃粒子计数器 北京中邦兴业是美国lighthouse中国区核心代理服务商&#xff0c;各类型号尘埃粒子计数器均有现货可发。常见尘埃粒子计数器类型&#xff1a;便携式&#xff08;台式&#xff09;、手持式、在线式、液体式。 客户现场 lighthouse浮游菌采样器 北京中…

nginx(七十五)nginx与Vary响应头细节探讨

一 Vary ① nginx与Vary有关联的地方 nginx源码分析处理Vary响应头的逻辑 CORS和缓存 gzip_vary 1) gzip_vary on 如果设置为开启2) 服务器返回数据时会在头部带上"Vary:Accept-Encoding"的标识3) 客户端便可以知道获取到的数据是否已经被压缩,默认为关闭 prox…

ros获取typec-usb摄像头

确保usb或者typec摄像头插在主机上,我这里是typec摄像头&#xff0c;使用了一个usb-typec转接头。 windows在设备管理器中查看是否存在端口&#xff0c;如果没有&#xff0c;可以使用下面的软件进行尝试。 链接&#xff1a;https://pan.baidu.com/s/1hxp3m68W6NjY-3D7q8rGnA 提…

Linux线程同步(1)——一个例子看懂为什么需要线程同步?

对于一个单线程进程来说&#xff0c;它不需要处理线程同步的问题&#xff0c;所以线程同步是在多线程环境下需要注意的问题。线程的主要优势在于&#xff0c;资源的共享性&#xff0c;譬如通过全局变量来实现信息共享&#xff0c;不过这种便捷的共享是有代价的&#xff0c;那就…

postman处理各种请求数据

1、后台request接收postman参数 2、后台单个参数接收postman 3、后台RequestParam参数接收postman 注意事项&#xff1a;情况一&#xff1a;全部都是单个字符串的 情况二&#xff1a;有可能是一个json对象序列化成字符串过来的&#xff0c;那么需要在form-data中设置 …

区间预测 | MATLAB实现QRCNN-LSTM卷积长短期记忆神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRCNN-LSTM卷积长短期记忆神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRCNN-LSTM卷积长短期记忆神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRCNN-LSTM分位数回…

Elasticsearch:如何在 Elasticsearch 中存储复杂的关系数据

在传统的数据库中&#xff0c;对数据关系的描述无外乎三种&#xff1a;一对一、一对多和多对多关系。 如果有关系相关的数据&#xff0c;我们一般在建表的时候加上主外键。 建立数据链接&#xff0c;然后在查询或者统计中通过 join 恢复或者补全数据&#xff0c;最后得到我们需…

Springboot +Flowable,设置流程变量的方式(二)

一.简介 为什么需要流程变量。 举个例子&#xff0c;假设有如下一个流程&#xff0c;截图如下&#xff1a; 这是一个请假流程&#xff0c;那么谁请假、请几天、起始时间、请假理由等等&#xff0c;这些都需要说明&#xff0c;不然领导审批的依据是啥&#xff1f;那么如何传递…

软件测试面试宝典,最常见的7个高频面试题(附答案,建议收藏)

收集了2022年所有黑马学员的面试题后&#xff0c;负责就业的黑马讲师们整理出了7个高频出现的面试题&#xff0c;一起来看看。 高频问题1&#xff1a;请自我介绍下&#xff1f; 高频问题2&#xff1a;请介绍下最近做过的项目&#xff1f; 高频问题3&#xff1a;请介绍下你印象…

2023 年第三届长三角高校数学建模 A 题 快递包裹装箱优化问题

2022 年&#xff0c;中国一年的包裹已经超过 1000 亿件&#xff0c;占据了全球快递事务量的一 半以上。近几年&#xff0c;中国每年新增包裹数量相当于美国整个国家一年的包裹数量&#xff0c; 十年前中国还是物流成本最昂贵的国家&#xff0c;当前中国已经建立起全世界最强大、…

利用jQuery做一个简单的猜数字游戏

目录 利用jQuery做一个简单的猜数字游戏 代码 效果 利用jQuery做一个简单的猜数字游戏 代码 <!DOCTYPE html> <html><head><title>键盘事件-猜数字</title><style>#body_style {background-color: #c7f5db;}#myDiv {position: absolu…

单片机GD32F303RCT6 (Macos环境)开发 (十七)—— i2c1从机中断接收发送数据

i2c1从机中断接收发送数据 1、将i2c1设置为从机模式&#xff0c;与树莓派连接。树莓派发送或者读取数据&#xff0c;gd32中断触发&#xff0c;从而接收数据或者向主机发送数据。 2、关于代码的宏定义配置 Application目录的Makefile中 ENABLE_I2C_TEST yes才会编译I2C1的相关…

为啥马斯克一边反对Open AI,一边又自己另搞AI

这事我过去就说过&#xff0c;我现在再老生常谈一次。 &#xff08;1&#xff09; 我过去说过一个事&#xff1a;汽车自己智能其实还不能做到真正的智能&#xff0c;必须车路人都智能了&#xff0c;智能汽车才能真正智能。 因为车路人智能&#xff0c;这本质是数字世界和数字世…

开源之夏 2023 | 与 Databend 一同探索云数仓的魅力

活动概览 开源之夏是由中科院软件所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;培养和发掘更多优秀的开发者&#xff0c;促进优秀开源软件社区的蓬勃发展&#xff0c;助力开源软件供应链…