指针拔尖1——(看完包会,不会来打我)

news2025/1/12 15:42:51

文章目录

  • 前言:本章节涵盖——
  • 一、指针变量基础
  • 二、字符指针
  • 三、指针数组和数组指针
  • 拓展:数组名和&数组名的区别
  • 四、 指针传参
  • 总结


前言:本章节涵盖——

1.指针变量基础知识
2.字符指针
3.数组指针
4.指针数组
5.指针传参


一、指针变量基础

本章我们讲前4节
在这里插入图片描述

二、字符指针

代码如下(示例):

#include<iostream>
using namespace std;
int main()
{
    const char* ps = "hello c++";
	char arr[] = "hello c++";

	cout << ps <<endl;//hello c++,为什么会出现这种情况???指针为什么是字符串,而不是地址
	cout << *ps << endl;//h,解引用就是首元素本身
	cout << *(ps + 1) << endl;//e

	cout << *arr << endl;//h
	cout << arr << endl;//h
}

图例
在这里插入图片描述

为什么会有这种情况?不是说指针存放变量的地址吗?——答案:字符指针指向字符串的地址也指向了字符串本身元素 ,const字符指针是常量
为什么会是字符串?真相只有一个。因为在C语言中,字符串是以字符数组的形式存储的。字符数组由连续的内存空间组成,其中每个元素都存储着字符串中的一个字符。字符指针可以指向字符数组的首地址,也就是字符串的起始位置。当我们通过字符指针访问字符串时,它会从指针指向的内存地址开始连续读取字符,直到遇到字符串的结束标志\0为止。所以字符指针是一种特殊的指针,它可以指向字符数组,又可以指向字符串的地址。
这个是详细解释:总结一句话:"hello c++''就是一个常量。地址比较独特,很难直接获取或者说不允许直接被获取!
下面看一道面试题来巩固提高
在这里插入图片描述
这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域。当几个指针,指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。

三、指针数组和数组指针

1.指针数组

1.指针数组——顾名思义就是存放指针的数组,可以来打印二维数组
在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{
	int a[5] = { 1,2,3,4,5 };
	int b[] = { 2,3,4,5,6 };
	int c[] = { 3,4,5,6,7 };

	int* arr[3] = { a,b,c };

	for (size_t i = 0; i < 3; i++)
	{
		for (int j = 0;  j < 5;j++)
		{
			cout << arr[i][j]<<" ";
		}
		cout << endl;
	}
}

在这里插入图片描述

2.数组指针
数组指针是指针,指针指向一个数组的首元素的地址,数组名表示数组首元素的地址

在这里插入图片描述
(示例):int arr[5]={1,2,3,4,5},数组名arr表示数组首元素的地址,
int *p=arr; arr是p等价的了,p和arr操作什么打印什么都相同

既然都说到这里了,接下来我们来共同探究数组名和&数组名的区别

拓展:数组名和&数组名的区别

我先把结论和常常用到的知识点告诉大家!!!
除了sizeoof(arr)和&arr中arr表示的是整个数组
其他时候arr都表示数组首元素的地址
arr表示数组首元素的地址,arr+1表示首元素下个元素的地址
&arr表示整个数组的地址。&arr+1表示跳过整个数组, 最后一个元素后的地址也就是下一个数组首元素的地址
arr和&arr地址大小一样,门牌号一样,但意义不一样

在这里插入图片描述在这里插入图片描述

看看例题:

在这里插入图片描述

#include<iostream>
using namespace std;
//数组指针,指向数组的是指针。

int main()
{
	cout << "1.arr和&arr的区别" << endl;

	int arr[10] = { 1,2,3,4,5 };

	int* p1 = arr;//arr为int类型的地址,取出什么样的地址

	cout << p1 << " "<<arr << endl;//你会发现arr和p1一模一样
	cout << p1 + 1<<" "<< arr + 1 << endl;

	int(*p2)[10]= &arr;//取出的是数组的地址

	double *d[5]={};

	double* (*pd)[5] = &d;

	cout << p2 << endl;
	cout << p2 + 1 << endl;

	//括号括起来不要让p和[]结合,否则p就是数组的一部分了
	cout << arr <<" " << &arr << endl;//000000BA42EFFAF8 000000BA42EFFAF8,arr和&arr地址大小一样,门牌号一样,但意义不一样
	//arr是首元素的地址,&arr是数组的地址
	cout << arr + 1 <<" " << &arr + 1 << endl;//	000000BA42EFFAFC 000000BA42EFFB20

	cout <<endl;
	

在这里插入图片描述

数组指针的应用可以干什么????——打印二维数组,传参的作用,做形式参数

#include<iostream>
using namespace std;
void print(int arr[3][5], int r, int c)
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++) {
			cout << arr[i][j]<<" ";
		}
		cout << endl;
	}
}
 
//p是一个数组指针——指向一维数组的数组指针
void print2(int (*p)[5],int r,int c)
{
	for (size_t i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			cout<<*(*(p + i)+j)<<" ";
			//*(p+i),把二维数组看出一维数组连在一起
		}
		cout << endl;
	}
}
	cout << "2.数组指针的应用" << endl;

	int arr1[3][5] = {{1, 2, 3, 4, 5}, { 2,3,4,5,6 }, { 3,4,5,6,7 }};
	print(arr1, 3, 5);//arr1数组名,二维数组首元素的地址表示第一行的地址!!!
	cout << "**************" << endl;
	print2(arr1, 3, 5);
	return 0;
}

在这里插入图片描述

四、 指针传参

在这里插入图片描述
在这里插入图片描述

总结

提示:这里对文章进行总结:学习了这半章我们知道了,
1.字符指针指向字符串的地址也指向了字符串本身,他是一个比较特殊的存在,并且const修饰字符指针是常量,只有一份存在。

2.数组指针和指针数组——怎么判断?看最里面括号变量和右边的操作符
int*p[10]指针数组, int(*p)[10]数组指针,我们要记住解引用操作符的优先级很低,没有括号直接被孤立。共同的是他们都可以用来打印二维数组。

3.指针传参
参数类型和放回值类型一定要 一 一 对应,
除了sizeoof(arr)和&arr中arr表示的是整个数组**
其他时候arr都表示数组首元素的地址**
一维数组名arr表示数组首元素的地址,&arr表示整个数组的地址
二维数组名arr表示第一行的地址,&arr数组首元素的地址

例如:以上就是今天要讲的内容,多多点赞支持,下半章火速更新

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

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

相关文章

I/O多路复用【Linux/网络】(C++实现select、poll和epoll服务器)

阅读前导&#xff1a; “I/O 多路复用”处于知识树中网络和操作系统的最后&#xff0c;因此本文默认读者有计算机网络和操作系统的基础。 1. 引入&#xff1a;C10K 问题 c10k 问题是指如何让一个服务器同时处理超过 10000 个客户端的连接&#xff0c;这是一个网络编程中的经…

人机环境系统智能需要新的逻辑和数学体系

人机环境系统智能需要一个新的逻辑体系&#xff0c;以应对复杂多变、高度动态和不确定性的实际应用场景。 传统逻辑体系主要基于精确的符号逻辑和精确的数学方法&#xff0c;适用于精确的、确定性的问题。但在人机环境系统智能领域&#xff0c;问题往往是复杂的、动态的&#x…

体验华为云CodeArts Check IDE插件国际化展示效果

作者&#xff1a; yd_257945187 原文链接&#xff1a;体验CodeArts Check IDE插件国际化展示效果-云社区-华为云 开发者自述 俗话说“工欲善其事&#xff0c;必先利其器”&#xff0c;把自己的IDE配置的即逼格又好看&#xff0c;是每个程序员的梦想&#xff01;IDE插件亦是如…

Leetcode hot 100之二叉树

目录 (反)序列化二叉树&#xff08;str<->tree&#xff09;&#xff1a;前序 前序遍历&#xff08;迭代&#xff09;/路径 stack.length 入栈&#xff1a;中右左 出栈&#xff1a;中左右 中序遍历&#xff08;迭代&#xff09; cur||stack.length 后序遍历&#x…

机器视觉工程师,公司设置奖金,真的为了奖励你吗?其实和你没关系

​据说某家大厂&#xff0c;超额罚款&#xff0c;有奖有罚很正常&#xff0c;但是我觉得你罚款代理商员工就不一样了&#xff0c;把代理商当成你的员工&#xff0c;我就觉得这些大厂的脑回路有问题。 有人从来没听说过项目奖金&#xff0c;更没有奖金。那么为什么设置奖金呢&a…

开源大模型正在“杀死”闭源?

点击关注 文丨郝 鑫&#xff0c;编丨刘雨琦 “OpenAI不足为惧&#xff0c;开源会慢慢赶上来。” 彼时Hugging Face创始人Clem Delangue的一句预言&#xff0c;正在迅速成为现实。 ChatGPT横空出世7个多月后&#xff0c;7月19日&#xff0c;Llama 2宣布开源&#xff0c;并且可…

OpenCV实现求解单目相机位姿

单目相机通过对极约束来求解相机运动的位姿。参考了ORBSLAM中单目实现的代码&#xff0c;这里用opencv来实现最简单的位姿估计. mLeftImg cv::imread(lImg, cv::IMREAD_GRAYSCALE); mRightImg cv::imread(rImg, cv::IMREAD_GRAYSCALE); cv::Ptr<ORB> OrbLeftExtractor …

No169.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Neo4j深度学习

Neo4j的简介 Neo4j是用Java实现的开源NoSQL图数据库。从2003年开始开发&#xff0c;2007年正式发布第一版&#xff0c;其源码托管于GitHtb。Neo4j作为图数据库中的代表产品&#xff0c;已经在众多的行业项目中进行了应用&#xff0c;如&#xff1a;网络管理、软件分析、组织和…

Android Camera FW 里的requestId和frameId

安卓相机frameworks里面经常出现requestId和frameId&#xff0c;最近简单看了一下代码&#xff0c;发现相关流程还是很复杂的&#xff0c;总结来看requestId 就是上层&#xff08;java&#xff09;发送的repeating(capture)请求的id&#xff0c;是从0开始递增的。 这是CameraD…

Linux基本指令(下)——“Linux”

各位CSDN的uu们好呀&#xff0c;今天&#xff0c;小雅兰的内容仍然是Linux中的基本指令啦&#xff0c;下面&#xff0c;让我们进入Linux的世界吧&#xff01;&#xff01;&#xff01; Cal指令 find指令&#xff1a;&#xff08;灰常重要&#xff09; -name grep指令 zip/un…

论文阅读--Cell-free massive MIMO versus small cells

无蜂窝大规模MIMO与小蜂窝网络 论文信息 Ngo H Q, Ashikhmin A, Yang H, et al. Cell-free massive MIMO versus small cells[J]. IEEE Transactions on Wireless Communications, 2017, 16(3): 1834-1850. 无蜂窝大规模MIMO中没有小区或者小区边界的界定&#xff0c;所有接入…

2023Node.js零基础教程(小白友好型),nodejs新手到高手,(二)NodeJS入门——buffer模块、计算机基础、fs模块、path模块

就算步子乱了又如何&#xff0c;接着跳下去就好了。——《闻香识女人》 开始 011_Buffer_介绍与创建 hello&#xff0c;大家好&#xff0c;我们来学习一下buffer。首先来看看 buffer 是一个什么东东。buffer&#xff0c;中文译为缓冲区&#xff0c;是一个类似于数组的对象&am…

关于分布式操作系统

关于分布式操作系统&#xff0c;如果你不太理解的话&#xff0c;可以把它看成是传统操作系统延展。二者的区别在于&#xff0c;传统的操作系统都是单机系统&#xff0c;只能在一台计算机上运行&#xff0c;而分布式操作系统是多机系统&#xff0c;每台计算机都是系统中的一个计…

从抽象类和普通类的区别中体会设计模式

普通类可以实例化&#xff0c;抽象类型只能去继承&#xff0c;抽象类用于定义一些基本的行为和属性&#xff0c;具体的行为由子类去完成。我们先来看下下边的代码&#xff1a; 我们也来顺便总结一下普通类和抽象类的区别&#xff1a; 实例化&#xff1a;普通类可以直接实例化&…

架构师选择题--信息安全技术(系统安全)

架构师选择题--信息安全技术 真题 很少超纲 真题 b c d d b a d a d a Kergberos和数字证书是类似的协议 向TGS申请票据 C PGP&#xff1a;安全电子邮件传输协议 b c b 使用发送方是私钥加密摘要–发送方不可抵赖 加密&#xff1a;保密性 信息摘要&#xff1a;完整性 数…

(面试)谈谈我对C++面向对象特性的理解

&#x1f4af; 博客内容&#xff1a;C读取一行内个数不定的整数的方式 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&…

等精度频率计verilog,quartus仿真视频,原理图,代码

名称&#xff1a;等精度频率计设计verilog quartus仿真 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; A&#xff1a;测量范围信号:方波 频率:100Hz~1MHz; B&#xff1a;测试误差:<0.1%(全量程) C&#xff1a;时钟频率:50kHz D&#xff1a;预闸…

UniApp项目实践HelloUni

效果镇楼 书接上文&#xff0c;继续写入内容&#xff1b;哪怕一句话代码呢&#xff0c;今天的一小步&#xff0c;将来的一大步 <template><div class"box"><h1>uniapp <span class"row">零基础</span>入门和快速进阶课程&l…

​​金TECH频道|最近备受关注的应用重构,到底怎么做?

“金TECH频道”旨在为您分享中电金信助力行业数字化转型的最新产品业务动态、技术观点洞察与应用实践案例。让我们在这里&#xff0c;与行业发展同频共振&#xff0c;共筑数字新基石。 ​​