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

news2025/1/15 12:51:06

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

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

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;
}

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

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

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

相关文章

log4j2.xml介绍和使用

log4j2.xml是什么 log4j2.xml 是用于配置 Apache Log4j 2 的 XML 格式配置文件。Log4j 2 是一个用于 Java 应用的流行日志框架&#xff0c;提供灵活的日志管理和配置。在 log4j2.xml 文件中&#xff0c;可以配置日志记录的格式、级别、目的地等。 下面是一些主要节点和属性的…

内容管理平台原来对企业这么重要,看完收藏!

“内容为王”&#xff0c;这是当今数字化时代的一个重要真理。不论是创业新贵、还是行业巨头&#xff0c;纷纷开始深入理解和应用内容管理平台&#xff08;Content Management System&#xff0c;简称CMS&#xff09;&#xff0c;以便更好的管理其大量的内容和信息。 那么&…

网络安全从业人员何去何从

从2024年1月1日开始到今天&#xff0c;基本没有真正放下自己休息过一天。可能很多人会说是卷&#xff0c;其实真正的原因是压力。不仅仅是生活压力还有行业压力。 今年这个行业让很多人开始感到了迷茫&#xff0c;不仅是股市的低迷&#xff0c;更多的来自于各大公司不断的因为…

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些?

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些? 架构的本质 架构本身是一种抽象的、来自建筑学的体系结构,其在企业及IT系统中被广泛应用。 架构的本质是对事物复杂性的管理,是对一个企业、一个公司、一个系统复杂的内部关系进行结构化、体系化的抽象,…

Stable-Diffusion的WebUI部署实战

1、环境准备及安装 1.1、linux环境 # 首先&#xff0c;已经预先安装好了anaconda&#xff0c;在这里新建一个环境 conda create -n sdwebui python3.10 # 安装完毕后&#xff0c;激活该环境 conda activate sdwebui# 安装 # 下载stable-diffusion-webui代码 apt install wget…

String 底层是如何实现的?

1、典型回答 String 底层是基于数组实现的&#xff0c;并且数组使用了 final 修饰&#xff0c;不同版本中的数组类型也是不同的&#xff1a; JDK9 之前&#xff08;不含JDK9&#xff09; String 类是使用 char[ ]&#xff08;字符数组&#xff09;实现的但 JDK9 之后&#xf…

C#版开源免费的Bouncy Castle密码库

前言 今天大姚给大家分享一款C#版开源、免费的Bouncy Castle密码库&#xff1a;BouncyCastle。 项目介绍 BouncyCastle是一款C#版开源、免费的Bouncy Castle密码库&#xff0c;开发人员可以通过该项目在他们的 C# 应用程序中使用 Bouncy Castle 提供的各种密码学功能&#x…

如何使用 Langchain、Ollama 和 Streamlit 构建 RAG

一、先决条件&#xff1a;您需要了解什么 在深入讨论技术细节之前&#xff0c;我们先概述一下先决条件。Python 的基础知识至关重要&#xff0c;因为它是我们将使用的主要语言。熟悉机器学习和自然语言处理的基本概念将帮助您更轻松地掌握这些概念。此外&#xff0c;对 Langch…

瑞熙贝通实验室物联网管理平台新升级|支持远程开门视频监控与电源控制以及环境监测

瑞熙贝通实验室智能物联网管控平台&#xff1a;利用“互联网与物联网技术”有机融合&#xff0c;对实验室的用电安全监测、实验室环境异常监测&#xff08;颗粒物监测、明火监测、可燃气体、烟雾监测、温湿度传感器、红外人体感应&#xff09;、实验室人员安全准入、万物互联等…

16、技巧之九: 修改参数,如何让表格翻页滚动到底部?【Selenium+Python3网页自动化总结】

1、问题提出 在网页配置参数时&#xff0c;输入参数名称搜索&#xff0c;搜出来的同名参数结果有多个&#xff0c;分布在一个表格的不同行&#xff0c;表格是动态加载的&#xff0c;需要滚动鼠标才能把所出参数找出来。用selenium怎么实现这种参数修改&#xff1f; 2、网页元素…

数字工厂管理系统和ERP管理系统有什么区别

在制造业的数字化转型浪潮中&#xff0c;数字工厂管理系统和ERP管理系统作为两大核心系统&#xff0c;扮演者不可或缺的角色。虽然它们都是为了提高企业的运营效率和降低成本&#xff0c;但在功能与实施效果方面&#xff0c;二者却有着显著的区别。本文将从这两个方面对数字工厂…

Pytorch实战01——CIAR10数据集

目录 1、model.py文件 &#xff08;预训练的模型&#xff09; 2、train.py文件&#xff08;会产生训练好的.th文件&#xff09; 3、predict.py文件&#xff08;预测文件&#xff09; 4、结果展示&#xff1a; 1、model.py文件 &#xff08;预训练的模型&#xff09; impor…

day57 动态规划part17● 647. 回文子串 ● 516.最长回文子序列● 动态规划总结篇

如果大家做了很多这种子序列相关的题目&#xff0c;在定义dp数组的时候 很自然就会想题目求什么&#xff0c;我们就如何定义dp数组。 布尔类型的dp[i][j]&#xff1a;表示区间范围[i,j] &#xff08;注意是左闭右闭&#xff09;的子串是否是回文子串&#xff0c;如果是dp[i][j…

C++学习路线

C学习路线思维导图&#xff0c;肝了一个星期终于搞定&#xff0c;这么硬核求个赞不过分吧&#xff1f; 思维导图的内容&#xff0c;也是本文的内容框架&#xff0c;坐稳扶好&#xff0c; C 高速快车要发车了&#xff01; 内容我会持续更新&#xff0c;点赞收藏&#xff0c;…

Window系统下Vscode配置C/Cpp运行+调试环境

Window系统下Vscode配置C/Cpp运行调试环境 文章目录 Window系统下Vscode配置C/Cpp运行调试环境1.安装Vscode2.安装C/Cpp插件3.配置gcc编译器4.配置Cpp运行环境5.配置Cpp调试环境 1.安装Vscode 安装VScode很简单&#xff0c;直接到官网进行下载&#xff0c;然后傻瓜安装即可。 …

读CDO代码

前置任务 module PIL.Image has no attribute ANTIALIASImage.ANTIALIAS 替换为 Image.LANCZOS&#xff0c;参考https://blog.csdn.net/fovever_/article/details/134690657 OSError: science is not a valid package style, path of style file, URL of这是对应可视化里面生…

GraphView实现测量工具

效果演示&#xff1a; 主模块代码&#xff1a; MeasureGraphView::MeasureGraphView(QWidget *parent): QWidget(parent) {ui.setupUi(this);m_measureType NoType;m_bll BllData::getInstance();m_scene new GraphicsScene;connect(m_bll, &BllData::pressMeasurePos…

力扣106 从中序与后续遍历序列构造二叉树

文章目录 题目描述解题思路代码 题目描述 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], …

【单片机毕业设计7-基于stm32c8t6的智能温室大棚系统】

【单片机毕业设计7-基于stm32c8t6的智能温室大棚系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇7基于stm32的智能衣柜系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖可私 一、功能介绍 ---------------…

Sqllab第一关通关笔记

知识点&#xff1a; 明白数值注入和字符注入的区别 数值注入&#xff1a;通过数字运算判断&#xff0c;1/0 1/1 字符注入&#xff1a;通过引号进行判断&#xff0c;奇数个和偶数个单引号进行识别 联合查询&#xff1a;union 或者 union all 需要满足字段数一致&…