指针【理论知识速成】(3)

一.指针的使用和传值调用:

在了解指针的传址调用前,先来额外了解一下 “传值调用”

1.传值调用:

对于来看这个帖子的你相信代码展示胜过千言万语

#include <stdio.h>
#include<assert.h>
int convert(int a, int b)
{
	int c= 0;
	 c = a;
	 a = b;
	 b = c;
	return(a, b);
}
int main()
{
	int x = 0;
	int y = 30;
	convert(x, y);
	printf("x=%d y=%d", x, y);
	return 0;
}
//输出结果依然为x=0,y=30;

那为什么通过函数调用最终x,y的结果依然没有被改变?因为在调用时形参a,b也会单独开辟一块新的空间,a与x之间与b同y之间依旧相互独立,所以a是a,x是x,同理b是b,y是y,a只是继承了x的数值而已,b 也只是继承了y的数值而已。所以传值调用的定义就把变量本身传递给了函数
那如果想通过函数调用改变x,y又该怎么办呢?接下来就需要了解传址调用啦

2.传址调用:

同样的定义来之前先将代码呈上

#include <stdio.h>
#include<assert.h>
int convert(int * a, int * b)
{
	int c= 0;
	 c = *a;
	 *a = *b;
	 *b = c;
	return(*a, *b);
}
int main()
{
	int x = 0;
	int y = 30;
	convert(&x, &y);
	printf("x=%d y=%d", x, y);
	return 0;
}
//输出结果为x=30,y=0;

此代码不同于上一代码,此码将x,y的地址通过指针传递到函数convert中,成功调换了x,y的值。所以将变量的地址传递给函数,就叫做传址调用
。#### 3.传值调用传址调用分别在何种情况下使用:
了解了传值调用与传址调用后那么在何种情况下使用传址调用,又该在何种情况下使用传值调用呢?

答:在不需要改变变量本身时可采用传值调用,否则采用传址调用。

二.指针和数组的关系

前面提到过指针可以用来查询地址,int *p=arr, *p=arr[0],又提到过指针类型的作用,即为指针+1时所跳过的字节数,这一块则是在细致的讲指针如何遍历数组

1.数组名的理解

int main()
{
	int arr[] = { 1,2,3,4 ,5};
	printf("%p ", arr);
	printf("%p ", &arr);
	printf("%p ", &arr[0]);
	printf("%p ", sizeof(arr));

	return 0;
}

输出结果:

在这里插入图片描述

由此可看到上述四组输出arr,&arr,&arr[0],都指向了同一地址,是不是证明三种指针完全性等,事实真的是这样嘛,再来看一组代码

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

	return 0;
}

输出结果:
在这里插入图片描述
在上述结果中arr与arr[0]在+1后也指向同一地址,而&arr,则指向了其它区域,经过计算发现arr与arr[0]+1跳过的字节长度为一个元素,而&arr+1跳过的长度为一个数组,综上可以确定arr与arr[0]是完全相等的,指向的位置为元素的首地址,但同样有例外**&arr取的就是整个元素的地址,除此之外sizeof(arr)取的也是整个元素的地址**。

2.使用指针访问数组

#include<stdio.h>
int main()
{
	int arr[10] = {};
	int* p = arr;
	int j = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (j = 0; j < sz; j++)
	{
		scanf("%d", p + j);
	}
	for (j = 0; j < sz; j++)
	{
		printf("%d", p + j);//将p+j改为p[j],也完全可以,结果不会产生改变
	}
	return 0;
}

3.一维数组传参的本质

数组在传参的时候所传的是数组首元素的地址

#include<stdio.h>
int print(int arr[])//传递的其实是一个指针
{
	int sz = sizeof(arr) / sizeof(arr[0]);//这里算的是指针的大小比上元素个数的大小
	printf("s=%d", sz);
	return 0;
}
int main()
{
	int arr[10] = {};
	print(arr);
	return 0;
}
//程序的输出结果在x64的环境下为2,x86为1.

二.二维指针

在正式了解二维指针前,可以先联想“二维数组”,二维数组的定义就是以一维数组为元素组成的数组,可推测二维指针大概意思是指向一维指针的指针就叫做二维指针。
在这里插入图片描述

1.代码表示:

int *p=0;//此为一维指针
int ** pp=0;//此为指向一维数组*p,的二维指针*pp(二维指针的名称不一定和一维指针的名称有关系)

2.组成:

在这里插入图片描述
不要把二维指针想的过于复杂,其实*p也就是一个指针变量

3.作用:

二维指针可以通过查询一维指针指向的地址,寻找到变量

#include<stdio.h>
int main()
{
	int a = 0;
	int* p = &a;
	int** q = &p;
	printf("%d", **q);
	return 0;
}
//输出结果为0

三.指针数组

同样的在了解指针数组前先联想“整型数组”,没错指针数组就是由指针组成的数组,就是这么好懂
在这里插入图片描述

1.表示方式以及组成:

int arr[]={1,2,3,4};//这个是整型数组,int 表示的就是数组元素的类型是int 
int * arr[]={arr,arr1,arr2}//这个是指针数组,int *表示的就是数组元素类型是int *

2.:指针数组模拟二维数组:

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3 };
	int arr1[] = { 2,3,4 };
	int arr2[] = { 3,4,5 };
	int* a[] = { arr,arr1,arr2 };
	int i, j;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf("%d ", a[i][j]);//也可以写成*(*(a[i])+j)
		}
		printf("%d\n");
	}
	return 0;
}

注:二维数组中的每个元素都是连续存放的,而指针数组中的每个元素并不确保是连续存放

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

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

相关文章

优维大模型解密:从提示词工程到场景应用 ,剑指AIOps的牛刀小试

莫名其妙的“涌现”袭来&#xff0c;就像是海上来路不明的诡异海啸&#xff0c;当很多人都在吹捧大模型时&#xff0c;优维则选择理性潜入深水区&#xff0c;掌握了大模型的来龙去脉&#xff0c;也在实际应用中获得产品经验方法论。 这篇文章旨在全面剖析优维科技在大模型应用…

算法思想总结:双指针算法

一、移动零 . - 力扣&#xff08;LeetCode&#xff09; 移动零 该题重要信息&#xff1a;1、保持非0元素的相对位置。2、原地对数组进行操作 思路&#xff1a;双指针算法 class Solution { public:void moveZeroes(vector<int>& nums){int nnums.size();for(int cur…

手把手写深度学习(23):视频扩散模型之Video DataLoader

手把手写深度学习(0)&#xff1a;专栏文章导航 前言&#xff1a;训练自己的视频扩散模型的第一步就是准备数据集&#xff0c;而且这个数据集是text-video或者image-video的多模态数据集&#xff0c;这篇博客手把手教读者如何写一个这样扩散模型的的Video DataLoader。 目录 准…

挑战杯 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习多目标跟踪 …

4G安卓核心板T310_紫光展锐平台方案

紫光展锐T310应用 DynamlQ架构 12nm 制程工艺&#xff0c;采用 1*Cortex-A753*Cortex-A55处理器&#xff0c;搭载Android11.0操作系统&#xff0c;主频最高达2.0GHz.此外&#xff0c;DynamlQ融入了AI神经网络技术&#xff0c;新增机器学习指令&#xff0c;让其在运算方面的机器…

绝对省事!多微信聚合聊天神器大揭秘!

在如今社交网络发达的时代&#xff0c;微信已成为人们生活中不可或缺的通讯工具。然而&#xff0c;对于拥有多个微信账号的用户来说&#xff0c;经常需要来回切换不同账号&#xff0c;给日常使用带来一定的不便。 那么&#xff0c;有没有一种办法能够让我们摆脱这种繁琐的操作…

掼蛋-掌握出牌权

掼蛋游戏中&#xff0c;出牌权往往能决定一局牌的走向&#xff0c;掌握出牌权可以主动控制局势。出牌权是指在每一轮的出牌环节中谁先出牌。出牌权的重要性主要体现在以下两个方面&#xff1a; 一、控制节奏 出牌权可以让我们主动控制游戏的节奏&#xff0c;可以根据自己的出牌…

Post请求出现Request header is too large

问题描述&#xff1a; 在做项目的时候&#xff0c;前端请求体太大的时候&#xff0c;出现Request header is too large问题&#xff0c;后端接口如下&#xff1a; 前端请求接口返回问题如下&#xff1a; 解决方案&#xff1a; 问题原因&#xff1a;这是因为我们在做Springboo…

BUG:RuntimeError: input.size(-1) must be equal to input_size. Expected 1, got 3

出现的bug为:RuntimeError: input.size(-1) must be equal to input_size. Expected 1, got 3 出现问题的截图: 问题产生原因:题主使用pytorch调用的nn.LSTM里面的input_size和外面的数据维度大小不对。问题代码如下: self.lstm nn.LSTM(input_size, hidden_size, num_laye…

计算机网络-第6章 应用层(2)

6.5 电子邮件 电子邮件&#xff0c;把邮件发送到收件人使用的邮件服务器&#xff0c;并放在其中的收件人邮箱中。最重要的两个标准&#xff1a;简单邮件传送协议SMTP&#xff0c;互联网文本报文格式。 SMTP只能传7位ASCII码邮件&#xff0c;93年提出互联网邮件扩充MIME。邮件…

关于YOLOv9去掉辅助分支脚本使用的一些说明。

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; B站链接&#xff1a;YOLOv9去除辅助训练分支&#xff01;_哔哩哔哩_bilibili 一、说明 在subbranch_removal.py脚本中&#xff0c;我们需要填入上方…

新西兰 eSIM 卡 ONE NZ充值、激活

新西兰One NZ 保号规则和费用 先说大家比较关注的保号条件和费用吧。 新买的卡有效期 720 天&#xff0c;能够充值续期&#xff0c;但是充值后的有效期反而变为 360 天&#xff08;用于保号的兄弟就快过期再充值&#xff09;如果到期后不去充值&#xff0c;账户将变为非活跃状…

SAP 工单CO02 TECO时检查的增强BADI:WORKORDER_UPDATE

需求&#xff1a;需要在CO02进行TECO时检查一下 第三代增强&#xff1a;BADI&#xff1a;WORKORDER_UPDATE中的REORG_STATUS_ACT_CHECK方法 第一步&#xff1a;SE19输入BADI&#xff0c;然后创建 填入名称&#xff1a;ZWORKORDER_UPDATE和描述 输入类名&#xff1a;ZCL_WORKORD…

C语言函数—自定义函数

如果库函数能干所有的事情&#xff0c;那还要程序员干什么&#xff1f; 所有更加重要的是自定义函数。 自定义函数和库函数一样&#xff0c;有函数名&#xff0c;返回值类型和函数参数。 但是不一样的是这些都是我们自己来设计。 这给程序员一个很大的发挥空间。 函数的组…

第十四届蓝桥杯蜗牛

蜗牛 线性dp 目录 蜗牛 线性dp 先求到达竹竿底部的状态转移方程 求蜗牛到达第i根竹竿的传送门入口的最短时间​编辑 题目链接&#xff1a;蓝桥杯2023年第十四届省赛真题-蜗牛 - C语言网 关键在于建立数组将竹竿上的每个状态量表示出来&#xff0c;并分析出状态转移方程 in…

在Linux中进行OpenSSH升级

由于OpenSSH有严重漏洞&#xff0c;因此需要升级OpenSSH到最新版本。 OpenSSL和OpenSSH都要更新&#xff0c;OpenSSH依赖于OpenSSL。 第一步&#xff0c;查看当前的OpenSSH服务版本。 命令&#xff1a;ssh -V 第二步&#xff0c;安装、启动telnet&#xff0c;关闭安全文件&a…

免费AI软件开发工具测评:iFlyCode VS CodeFlying

前言 Hello&#xff0c;各位看官&#xff0c;今天为大家带来两款人工智能的软件开发工具的测评&#xff0c;他们分别是iFlyCode和CodeFlying&#xff0c;我相信当大家看到这两款产品名字的时候不禁都会有些好奇&#xff0c;两个产品都有Code 和Fly两个元素&#xff0c;那他们之…

Python语言在编程业界的地位——《跟老吕学Python编程》附录资料

Python语言在编程业界的地位——《跟老吕学Python编程》附录资料 ⭐️Python语言在编程业界的地位2024年3月编程语言排行榜&#xff08;TIOBE前十&#xff09; ⭐️Python开发语言开发环境介绍1.**IDLE**2.⭐️PyCharm3.**Anaconda**4.**Jupyter Notebook**5.**Sublime Text** …

若依上传文件/common/upload踩坑

前言&#xff1a;作者用的mac系统&#xff08;这个是个坑&#xff09;&#xff0c;前端用的uniapp&#xff0c;调用若依通用上传方法报错NoSuchFileException: /home/ruoyi/uploadPath/upload... 前端上传代码示例如下: uni.chooseImage({count: 1,success(res){ uni.uploa…

在centos8中部署Tomcat和Jenkins

参考链接&#xff1a;tomcat安装和部署jenkins_jenkins和tomcat-CSDN博客 1、进入centos中 /usr/local 目录文件下 [rootlocalhost webapps]# cd /usr/local2、使用通过wget命令下下载tomcat或者直接在官网下载centos版本的包后移动到centos中的local路径下 3、下载tomcat按…