指针(三)

news2024/12/25 15:40:59

文章内容

1. 字符指针
2. 数组指针
3. 指针数组
 

文章内容

1. 字符指针

指针的概念:

1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。
3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。
4. 指针的运算。

在指针的类型中我们知道有一种指针类型为字符指针 char* ;

一般使用:

int main()
{
char ch = 'w';
char *pc = &ch;
*pc = 'w';
return 0;
}

还有一种使用方式如下:

int main()
{
const char* pstr = "hello bit.";//这里是把一个字符串放到pstr指针变量里了吗?
printf("%s\n", pstr);
return 0;
}

代码 const char* pstr = "hello world.";
特别容易让人以为是把字符串 hello world 放到字符指针 pstr 里了,但是/本质是把字符串 hello world. 首字符的地址放到了pstr中。

分享一道题目:

//int main()
//{
//	const char* p1 = "abcdef";
//	const char* p2 = "abcdef";
//
//	char arr1[] = "abcdef";
//	char arr2[] = "abcdef";
//
//	if (p1 == p2)
//	{
//		printf("p1 == p2\n");
//	}
//	else
//	{
//		printf("p1 != p2\n");
//	}
//
//	if (arr1 == arr2)
//	{
//		printf("arr1 == arr2\n");
//	}
//	else
//	{
//		printf("arr1 != arr2\n");
//	}
//
//	return 0;
//}

最终输出的答案为

这里p1和p2指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以arr1和arr2不同,p1和p2相同。



2. 数组指针

指针数组是什么意思?指针数组是一个存放指针的数组。

int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组

parr  就是一个指针数组。 

int main()
{
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[5] = { 2,3,4,5,6 };
	int arr3[5] = { 3,4,5,6,7 };

	int* parr[3] = { arr1, arr2, arr3 };
}


3. 指针数组

3.1 数组指针的定义

数组指针是指针?还是数组?
答案是:指针。
我们已经熟悉:
整形指针: int * pint; 能够指向整形数据的指针。
浮点型指针: float * pf; 能够指向浮点型数据的指针。
那数组指针应该是:能够指向数组的指针。
下面代码哪个是数组指针?
 

int *p1[10];
int (*p2)[10];
//p1, p2分别是什么?
int (*p)[10];
//解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。
所以p是一个指针,指向一个数组,叫数组指针。
//这里要注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
//这个便是数组指针

int *p[10]
//p先和[10]结合,说明p是一个数组,数组里面存放着10个整形的指针。
所以p是一个数组,里面存放着指针,角指针数组

3.2 &数组名VS数组名

对于下面的数组:

int arr[10];

arr 和 &arr 分别是啥?
我们知道arr是数组名,数组名表示数组首元素的地址。
那&arr数组名到底是啥?

注:1. sizeof(数组名),这里的数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小

       2. &数组名,这里的数组名表示整个数组,&数组名,取出的是整个数组的地址
我们看一段代码:

根据上面的代码我们发现,其实&arr、arr、&arr[0],虽然值是一样的,但是意义应该不一样的。
实际上: &arr 表示的是数组的地址,而不是数组首元素的地址。(细细体会一下)
数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40. 而其他的仅仅是跳过4。

3.3 数组指针的使用

那数组指针是怎么使用的呢?
既然数组指针指向的是数组,那数组指针中存放的应该是数组的地址。
看代码:

//这不是推荐的写法
//void print1(int (*p)[10], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		//*p 相当于数组名,数组名又是首元素的地址,所以*p就是&arr[0]
//		printf("%d ", *(*p + i));
//	}
//	printf("\n");
//}
//
//
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//写一个函数打印arr数组的内容
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//
//	print1(&arr, sz);
//
//	return 0;
//}

  

void print2(int (*p)[5], int c, int r)
//这里用的是数组指针存的是第一行的地址
{
	int i = 0;
	for (i = 0; i < c; i++)
	{
		int j = 0;
		for (j = 0; j < r; j++)
		{
			//p+i是指向第i行的
			//*(p+i)相当于拿到了第i行,也相当于第i行的数组名
			//数组名表示首元素的地址,*(p+i) 就是第i行第一个元素的地址
			printf("%d ", *(*(p + i) + j));
			//printf("%d ", p[i][j]);
		}

		printf("\n");
	}
}
int main()
{
	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
	//int (*ptr)[3][5] = &arr;
	//写一个函数,打印arr数组
	print2(arr, 3, 5);
	return 0;
}

数组指针跟二级指针有点相似(细细体会)......

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

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

相关文章

适配器stack和queue

目录 什么是适配器 模拟实现stack stack的特性 STL中stack的基本框架 接口实现 模拟实现queue queue的特性 STL中queue的框架 什么是适配器 适配器&#xff1a;所谓适配&#xff0c;适配的是容器(vector,list,deque....) 也就是不管是什么容器&#xff0c;都可以套用适…

chatgpt赋能python:Python如何设置输入的SEO

Python如何设置输入的SEO Python是一种高级的编程语言&#xff0c;具有容易上手、可扩展和开源等特点&#xff0c;因此在软件开发过程中得到广泛的应用。然而&#xff0c;如果您想让您的Python项目在搜索引擎上获得更好的排名和流量&#xff0c;您需要考虑如何设置输入的SEO。…

二叉搜索树(Binary Seach Tree)模拟实现

目录 二叉搜索树的性质 二叉搜索树的实现 结点类 接口类(BSTree) 二叉搜索树的插入(insert) 二叉搜索树的查找(find) 二叉搜索树删除(erase) 第二种、删除的结点右子树为空 第三种、删除的结点左子树为空 第四种、删除的结点左右都不为空 实现 二叉搜索树模拟实现代…

基于jupyter的轮廓检测及功能

文章目录 一、实验介绍二、实验步骤三、实验任务任务一&#xff1a;轮廓特征练习一: 找到每个轮廓的方向任务二&#xff1a;边界矩形练习二: 围绕轮廓裁剪图像 总结 一、实验介绍 1. 实验内容 本实验将学习轮廓检测及功能。 2. 实验要点 生成二进制图像来查找轮廓找到并画出…

kotlin函数返回函数

kotlin函数返回函数 https://blog.csdn.net/zhangphil/category_12220817.htmlhttps://blog.csdn.net/zhangphil/category_12220817.html 例1&#xff1a; // func返回匿名函数 fun func(msg: String): (String, Int) -> String {println("func函数 msg:$msg")/…

电能管理系统多功能电力仪表的应用 安科瑞 许敏

摘 要&#xff1a;基于车间用电设备的电能管理系统架构思路及实施方法&#xff0c;从硬件和软件方面对此方法进行了阐述。对车间旧设备改造以及新的电能管理系统提供一种思路和便捷的方法。 关键词&#xff1a;电能管理系统&#xff1b;多功能电力仪表&#xff1b;PLC&#x…

Azure Log Analytics:与Power BI集成

注&#xff1a;本文最初发布于https://d-bi.gitee.io, 2023年6月迁移至CSDN 前述 Azure Log Analytics是Azure Monitor中的一项分析服务。本文将讲述通过Log Analytics与Power BI集成的方式&#xff0c;获取Power BI工作区内的日志信息&#xff0c;包括各PBI数据集的CPU消耗&a…

6/5~6/6总结

创建存储过程 DELIMITER // CREATE PROCEDURE usingid() BEGIN SELECT AVG(id) FROM user; END // DELIMITER ; 要用DELIMITER //指定结束符为 "//", 要调用该存储过程&#xff1a; CAll usingid; 创建成功后在navicat里面的函数界面可以看见刚刚创建的存储过程…

【TCP/IP】IP地址与域名之间的转换 - gethostbyname 和 gethostbyaddr函数

目录 域名系统 DNS服务器 IP地址和域名之间的转换 通过域名获取IP地址 通过IP地址获取域名 域名系统 域名系统&#xff08;英文&#xff1a;Domain Name System&#xff0c;缩写&#xff1a;DNS&#xff09;是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式…

chatgpt赋能python:Python如何竖直输出?

Python如何竖直输出&#xff1f; Python作为一种功能强大的编程语言&#xff0c;在数据分析、人工智能、Web开发等领域得到广泛应用。不过&#xff0c;对于一些初学者或者日常编程较少的开发者来说&#xff0c;可能会遇到一些问题&#xff0c;例如如何竖直输出。 在Python中&…

软件过程与管理——民宿管理系统的项目实践报告(文档+ppt+图表源文件)

目录 一、题目分析与设计 二、评分标准 三、文档目录 四、文档下载 一、题目分析与设计 1、团队组织建设 同学们以3-5人为一组&#xff0c;最多5人一组&#xff0c;每组选择一个具体的软件项目&#xff0c;如现进行的个人毕业设计题目等为主题&#xff0c;要求项目的工作…

量子模拟器中的“弯曲时空”

光子盒研究院出品 当你想解释宇宙尺度的现象时&#xff0c;相对论很有效&#xff1a;比如黑洞碰撞时产生的引力波&#xff1b;量子理论在描述粒子尺度的现象时效果很好&#xff08;比如原子中单个电子的行为&#xff09;。但是&#xff0c;将这两者以一种完全令人满意的方式结合…

【SpinalHDL快速入门】4.6、复合类型之Vec

文章目录 1.1、描述1.2、声明1.2.1、实例 1.3、运算符1.3.1、比较&#xff08;Comparison&#xff09;1.3.2、类型转换&#xff08;Type cast&#xff09;1.3.3、杂项&#xff08;Misc&#xff09;1.3.4、Lib辅助函数&#xff08;Lib helper functions&#xff09; 1.1、描述 …

直播签到功能(互动功能发起端JS-SDK)

功能概述 本功能只支持角色为讲师/嘉宾/助教/管理员的用户进行发起和停止等操作。发起签到时可自定义设置签到时长和签到提示语。 图 / 讲师在直播客户端软件f中操作界面 图 / 学员直播观看页弹出签到界面 代码示例 注意&#xff0c;在开始以下步骤前需要先进行全局初始化设置…

chatgpt赋能python:Python-如何快速高效地求两数之和

Python - 如何快速高效地求两数之和 介绍 Python 是一种高级编程语言&#xff0c;适用于各种领域的软件开发。本文将介绍使用 Python 完成两个数字之和的操作。Python 以其清晰、简洁、易于学习和使用的特性闻名于世&#xff0c;既能作为脚本语言&#xff0c;又能进行面向对象…

基于stm32的超声波测距

文章目录 一、HC-SR04超声波测距模块说明1、产品特点2、电气参数3、HC-SR04超声波测距模块4、超声波时序图 二、 CUBEMX配置三、keil配置代码 模块选择&#xff1a; stm32f103c8芯片 HC-SR04超声波测距模块 一、HC-SR04超声波测距模块说明 1、产品特点 HC-SR04 超声波测距模块…

chatgpt赋能python:Python如何将两张图片叠加

Python如何将两张图片叠加 介绍 图像处理是计算机视觉领域的重要应用&#xff0c;而Python已经成为了图像处理中最流行的编程语言之一。在图像处理的过程中&#xff0c;有时需要将两张图片叠加在一起&#xff0c;这就需要用到Python中的图像叠加技术。 本文将介绍Python中如…

chatgpt赋能python:Python如何空一行:介绍

Python如何空一行&#xff1a;介绍 在Python编程中&#xff0c;经常需要在输出文字或代码时进行空行分隔。一个常用的场景就是在代码中加入注释&#xff0c;将注释与代码分开&#xff0c;使代码逻辑更加清晰易懂。在某些情况下&#xff0c;也需要在输出文字时进行空行分割&…

一次方维o2o商城PHP审计学习

PHP审计源码学习 一、渗透测试 起因是朋友问fanwei o2o源码搭建的站后台能不能拿shell&#xff0c;于是我进后台进行了一番尝试&#xff0c;各功能点没什么进展&#xff0c;好多地方过滤了&#xff0c;上传也是白名单&#xff0c;编辑器的1day修了&#xff0c;万幸的是有个拿…

priority_queue(优先级队列)模拟实现(堆方式)

目录 priority_queue初步介绍 堆 堆的模拟实现 接口实现 插入(push) AdJustUp(向上排序)接口 删除(pop) AdJustDown(向下排序算法) 适配器堆总结 仿函数 用仿函数对堆进一步封装 用堆进行封装优先级队列 代码总结 priority_queue初步介绍 priority_queue的性质是…