指针【理论知识速成】(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;
}

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

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

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

相关文章

模型量化(二)—— 训练后量化PTQ(全代码)

训练后量化&#xff08;Post-training Quantization&#xff0c;PTQ&#xff09;是一种常见的模型量化技术&#xff0c;它在模型训练完成之后应用&#xff0c;旨在减少模型的大小和提高推理速度&#xff0c;同时尽量保持模型的性能。训练后量化对于部署到资源受限的设备上&…

通过对话式人工智能实现个性化用户体验

智能交流新时代&#xff1a;如何选择对话式人工智能产品 在快速发展的数字环境中&#xff0c;对话式人工智能正在彻底改变企业与客户互动的方式。 通过集成机器学习、自然语言处理和语音识别等先进技术&#xff0c;对话式人工智能可提供个性化、无缝的用户体验。 了解对话式人…

中间件 | Kafka - [常见问题]

INDEX 1 消息丢失1.1 消息丢失位置1.2 如何避免消息丢失 2 顺序消费 1 消息丢失 1.1 消息丢失位置 1&#xff1a;producer 向 kafka 投递消息时2&#xff1a;kafka-topic 中 leader 已经写入了消息&#xff0c;向副本写入消息前挂了时3&#xff1a;消费者从 kafka 拉取了消息&…

OSCP靶场--Depreciated

OSCP靶场–Depreciated 考点(1. graphql枚举 2.CVE-2021-4034提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.155.170 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-13 04:19 EDT Nmap scan report for 192.168.…

平台靠不住了,独立站,自主权,LTD营销枢纽助力企业应对全球化挑战

当今全球化的市场环境中&#xff0c;我国的出海品牌和供应链面临着很大的挑战&#xff0c;但同时也蕴含着机遇。随着跨境电商的兴起&#xff0c;像亚马逊、TikTok等大的电商平台成为中国卖家走向世界的重要桥梁。不过&#xff0c;平台的政策改变和外部环境的不确定性因素给依赖…

Rabbit算法:轻量高效的加密利器

title: Rabbit算法&#xff1a;轻量高效的加密利器 date: 2024/3/13 18:14:31 updated: 2024/3/13 18:14:31 tags: Rabbit算法流密码高安全性高性能密钥调度加密解密抗攻击性 Rabbit算法起源&#xff1a; Rabbit算法是由Martin Boesgaard和Mette Vesterager提出的一种流密码算…

(C语言)strcpy与strcpy详解,与模拟实现

目录 1. strcpy strcpy模拟实现&#xff1a; 实现方法1&#xff1a; 实现方法2&#xff1a; 2. strcat strcat模拟实现&#xff1a; 1. strcpy 作用&#xff1a;完成字符串的复制。 头文件&#xff1a;<string.h> destination是字符串要复制到的地点&#xff0c;s…

这款自动引流软件居然能让你的营销效果翻倍提升!

在数字化时代&#xff0c;营销策略的高效执行对企业来说至关重要。自动引流软件作为现代企业营销工具箱中的一员&#xff0c;其重要性不言而喻。这类软件通过智能化、自动化的方式&#xff0c;将潜在客户吸引到企业的销售渠道中&#xff0c;从而为企业带来可观的收益和品牌曝光…

SpringBoot集成netty实现websocket通信

实现推送消息给指定的用户 一、依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://m…

武汉儿童医院变电所电力运维平台系统的设计及应用

彭姝麟 Acrelpsl 1 引言 2015年国务院发布《中共中央、国务院关于进一步深化电力体制改革的若干意见》&#xff08;中发[2015]9号&#xff09;&#xff0c;简称“电改9号文”。而本次新电改的重点是“三放开一独立三强化”&#xff1a;输配以外的经营性电价放开、售电业务放开…

法规解读 | 坚持总体国家安全观,新修订的《保守国家秘密法》今年5月1日起施行!

2024年2月27日&#xff0c;第十四届全国人大常委会第八次会议表决通过新修订的《中华人民共和国保守国家秘密法》&#xff08;以下简称保密法&#xff09;&#xff0c;自2024年5月1日起施行。 本次保密法修订坚持总体国家安全观&#xff0c;统筹发展与安全。 一方面吸收了一些工…

政务云安全风险分析与解决思路探讨

1.1概述 为了掌握某市政务网站的网络安全整体情况&#xff0c;在相关监管机构授权后&#xff0c;我们组织人员抽取了某市78个政务网站进行安全扫描&#xff0c;通过安全扫描&#xff0c;对该市政务网站的整体安全情况进行预估。 1.2工具扫描结果 本次利用漏洞扫描服务VSS共扫…

app逆向-ratel框架-sekiro框架的安装使用

文章目录 一、前言二、初次尝试三、原⽣APP的使⽤四、ratel框架结合sekiro框架使用 一、前言 sekiro主要支持多节点的程序调用&#xff0c;所以他归属于RPC&#xff08;Remote Procedure Call&#xff09;框架&#xff1a;API管理、鉴权、分布式、负载均衡、跨语言 开源文档&…

如何在群晖NAS部署WPS容器并实现无公网IP远程访问本地office软件

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本&#xff0c;通过…

【C语言】指针详解2

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《C语言》 &#x1f389;道阻且长&#xff0c;行则将至 前言 这篇博客分享的指针部分为与数组有关的指针知识&#xff0c;包括一位数组和二维数组 指针详解1的博客 【C语言】指针…

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

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

【Linux】Shell编程【二】

目录 Shell流程控制条件测试注意事项示例[ condition ]与[[ condition ]]的区别 if条件单分支语法示例1&#xff1a;统计根分区使用率示例2&#xff1a;创建目录 双分支if条件语句语法案例1&#xff1a;备份mysql数据库案例2&#xff1a;判断apache是否启动&#xff0c;如果没有…

网络学习:9个计算机的“网络层”知识点

目录 一、IP 地址 1.1 分类表示法&#xff1a; 1.1.1 分类表示地址的其他说明 1.2 无分类编址 CIDR 二、IP 数据报文格式 Q: IP 报文里有什么&#xff1f;可以不按顺序或者字节来讲一讲 三、 路由概念 3.1 路由表 3.2 路由网络匹配 3.3 ARP 解析 3.4 RARP 逆地址解析…

考试题库:华为HCIA-Datacom易错题⑦(含答案解析)

华为认证HCIA-Datacom易错题举例和答案分析。 1、现有一台交换机通过某端口与一个指定端口相连&#xff0c;但是该端口不转发任何报文&#xff0c;却可以通过接收BPDU来监听网络变化&#xff0c;那么该端口的角色应该是&#xff08; &#xff09;。 A、Designated端口 B、Al…

分布式搜索elasticsearch(1)

1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案…