深度理解指针(2)

 hello各位小伙伴们,关于指针的了解我们断更了好久了,接下来这几天我会带领大家继续我们指针的学习。

目录

数组名的理解

使用指针访问一维数组

一维数组传参的本质

二级指针

指针数组

使用指针数组来模仿二维数组


数组名的理解

我们首先来看一段代码:

#include<stdio.h>
int main ()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};printf("arr     =  %p",arr);printf("&arr[0] =  %p",&arr[0]);printf("&arr    =  %p",&arr); return 0;
}

经过编译器输出后均为00B6FACC,我们会自然而然的认为arr,&arr[ 0 ],还有&arr都会表示数组首元素地址,但是表示首元素地址的只有arr还有&arr[ 0 ]。&arr表示的是整个数组的地址。我们可以通过地址加1来进行验证一下。

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

 

发现只有arr还有&arr[0] 在加1后会跳过一整型(4个字节) ,而&arr+1会跳过整个元素。

所以&arr和&arr[0]、arr不一样,同时指针类型决定加减整数的步长。

使用指针访问一维数组

我通常在访问一维数组的时候会使用下标来进行访问。

#include<stdio.h>
int main ()
{int arr[10] = {0};int i = 0;//进行读取for(i = 0;i < 10;i++){scanf("%d",arr[i]);}//进行输出for(i = 0;i < 10;i++){printf("%d",arr[i]);}return 0; 
}

在学习了指针后可以使用指针地址来进行访问。

//……替换
//
int *p = arr;
scanf("%d",p + i);
//……替换
//
printf("%d",*(p + i));

我们将arr(数组首元素地址)赋给p(指针变量)后,p和arr等价。所以arr[ i ]与p[ i ]所表达的含义相同。

//……
//
scanf("%d", p + i);
//scanf("%d", arr + i);
//……
////printf("%d", *(p + i));// printf("%d", p[i]);//printf("%d", *(arr + i));//printf("%d", arr[i]);printf("%d", i[arr]);

 arr[i]和*(arr+i)是完全等价的,同时arr[i]在执行的时候也会转换成*(arr+i)。[ ]只是操作符i[arr]会转换成*(i+arr)。

一维数组传参的本质

先上代码:

#include<stdio.h>
void test(int arr[])
{int sz2 = sizeof(arr)/sizeof(arr[0]);printf("sz2 = %d\n",sz2);
}
int main()
{int arr[] = {1,2,3,4,5,6,7,8,9,10};int sz1 = sizeof(arr)/sizeof(arr[0]);test(arr);printf("sz1 = %d\n",sz1);
} 

 输出结果为sz1 = 10,sz2 = 1。为什么呢?

在test(arr)中我们可以看到传递的arr其实是数组首元素地址,在void test进行接收的时候的其实接收的是指针变量而不是真正又重新创建了一个新的数组。所以写成void test(int*p)比较好。但未来更加好理解所以写成int arr[ ]也不会是错的哦。

总结一下:

test(arr);传递数组名arr,是数组首元素的地址。
1、函数形参的部分是不会真实创建数组的,那抹就不需要数组的大小。
2、函数形参部分应该使用指针变量来接收int *p一维数组传参的时候,形参可以写成数组的形式,主要是为了方便使用,形参也可以写成指针变量的形式。

 这就是一维数组传参的本质。

二级指针

我们学习了一级指针是用来存储某一个整型变量或者字符变量地址的,是变量就会有地址那么一级指针变量谁来存储呢?答案:使用二级指针来对一级指针的地址进行存储。

#include<stdio.h>
int main ()
{int a = 10;int *pa = &a;int **ppa = &pa;return 0;
}

对int*pa和int**ppa的理解:*代表pa的类型是指针类型,int代表*pa所指向的内容(int a = 10)为整型。 int* *ppa第二个*代表ppa的类型为指针类型,int*代表*ppa所指向的内容(int*pa = &a)为指针类型。

如果想要对a进行输出可以使用:

//…………
//printf("%d",**ppa);
//

*ppa为pa,*pa就为a=10了。

指针数组

整型数组是用来存放整型,字符数组是用来存放字符,同理指针数组是用来存放指针的。

使用指针数组来进行访问:

#include<stdio.h>
int main ()
{int a = 10;int b = 20;int c = 30;int*arr[] = {&a,&b,&c};int i = 0;for(i = 0;i < 3;i++){printf("%d",*arr[i]);}
}

使用指针数组来模仿二维数组

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

 OK本期就到这里啦,这期主要讲解了指针与数组的关系,小伙伴们一定要好好学习指针,为后期学习打下坚实的基础。拜拜!(下期讲解深度理解指针3)

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

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

相关文章

【开源社区】Elasticsearch(ES)中 exists 查询空值字段的坑

文章目录 1、概述2、使用 null_value 处理空值3、使用 exists 函数查询值为空的文档3.1 使用场景3.2 ES 中常见的空值查询方式3.3 常见误区3.4 使用 bool 查询函数查询空值字段3.5 exists 函数详解3.5.1 bool 查询的不足3.5.3 exists 的基本使用 3.6 完美方案 1、概述 本文主要…

单例模式 详解

单例模式 简介: 让类只初始化一次, 然后不同的地方都能获取到同一个实例 这是非常常用的一种模式, 系统稍微大一点基本上都会用到. 在系统中, 不同模块的总管理类都已单例模式居多 这里我们不仅使用c实现单例模式, 也会用python2实现一遍 python代码 想要看更详细的python单…

手动下载Sentinel-1卫星精密轨道数据

轨道信息对于InSAR&#xff08;干涉合成孔径雷达&#xff09;数据处理至关重要&#xff0c;因为它影响从初始图像配准到最终形变图像生成的整个过程。不准确的轨道信息会导致基线误差&#xff0c;这些误差会以残差条纹的形式出现在干涉图中。为了消除由轨道误差引起的系统性误差…

Swift 6.0 如何更优雅的抛出和处理特定类型的错误

概述 从 Swift 语言诞生那天儿起&#xff0c;它就不厌其烦一遍又一遍地向秃头码农们诉说着自己的类型安全和高雅品味。 不过遗憾的是&#xff0c;作为 Swift 语言中错误处理这最为重要的一环却时常让小伙伴们不得要领、满腹狐疑。 在本篇博文中&#xff0c;您将学到如下内容&…

基于网格尺度的上海市人口分布空间聚集特征分析与冷热点识别

在上篇文章提到了同一研究空间在不同尺度下的观察可能会带来不同的见解和发现&#xff0c;这次我们把尺度缩放到网格&#xff0c;来看网格尺度下的空间自相关性、高/低聚类&#xff0c;这些&#xff0c;因为尺度缩放到网格尺度了&#xff0c;全国这个行政区范围就显的太大了&am…

基于Shader实现的UGUI描边解决方案遇到的bug

原文链接&#xff1a;https://www.cnblogs.com/GuyaWeiren/p/9665106.html 使用这边文章介绍的描边解决方案时遇到了一些问题&#xff0c;就是文字的描边经常会变粗&#xff0c;虽然有的时候也可以正常显示描边&#xff0c;但是运行一会儿描边就不正常了&#xff0c;而且不正常…

UDP+TCP

一、UDP协议 1.recvfrom:recvform(int sockfd,void *buf,size_t len,int flags,struct sockaddr *src_addr,socklen_t *addrlen); 参数&#xff1a;socket的fd; 保存数据的空间地址 &#xff1b; 空间大小&#xff1b; 默认接收方式&#xff08;默认阻塞&#xf…

【案例56】安全设备导致请求被拦截

问题现象 访问相关报表 第二次访问发现有相关的连接问题 问题分析 服务器访问相关节点&#xff0c;发现相关节点无此问题。从客户的客户端访问缺有问题。在nclog中发现如下日志&#xff0c;链接被重置。 直接访问服务器无丢包现象。客户端未开防火墙。装了杀毒软件已经卸载。…

简单记录:两台服务器如何超快速互传文件/文件夹

在服务器间传输文件和文件夹是一个常见的任务&#xff0c;尤其是在需要同步数据或进行备份时。以下是使用 scp 命令在两台服务器之间进行文件传输的基本步骤。 服务器A 至 服务器B&#xff1a;文件传输指南 前提条件 确保服务器A和服务器B之间网络互通。确认您有权限访问目标…

C语言 之 整数在内存中的存储、大小端字节序和字节序的判断

文章目录 整数在内存中的存储大小端字节序和字节序判断大小端有大小端的原因高位和地位怎么区分&#xff1f;图例判断机器大端还是小端的例题 整数在内存中的存储 整数的2进制表示方法有三种&#xff0c;即 原码、反码和补码 三种表示方法均有符号位和数值位两部分&#xff0c…

微信小程序获取当前位置并自定义浮窗

1、在腾讯地图api申请key&#xff08;添加微信小程序的appid&#xff09;。 每个Key每日可以免费使用100次&#xff0c;超过次数后会导致地图不显示。可以多申请几个Key解决。WebService API | 腾讯位置服务腾讯地图开放平台为各类应用厂商和开发者提供基于腾讯地图的地理位置…

当AI成为你的私人医生,与AI“医”路同行的奇妙体验

“ 从挂号到诊疗&#xff0c;再到后续的健康管理&#xff0c;人工智能&#xff08;AI&#xff09;正以一种全新的方式融入我们的生活。上海市第一人民医院的创新实践&#xff0c;便是这一变革的生动注脚。 ” AI就医助理&#xff1a;从“助手”到“伙伴” 当你踏入医院大门…

猜数3次-python

题目要求&#xff1a; 定一个数字&#xff08;1-10&#xff0c;随机产生&#xff0c;通过3次判断来猜出数字&#xff09; 数字随机产生&#xff0c;范围1-10有三次机会猜测数字&#xff0c;通过3层嵌套判断实现每次猜不中会提示大了或者小了 ps&#xff1a;补充随机函数 imp…

Spring源码解析(34)之Spring事务回滚流程

一、前言 在上一个篇章我们主要介绍了Spring事务的运行流程&#xff0c;也带着一步步debug看了整个事务的运行流程&#xff0c;但是还是欠缺了Spring事务的回滚的流程。 在上篇也主要介绍了Spring事务的传播特性&#xff0c;这里还是要看一下Spring事务的传播特性&#xff0c;因…

定制开发AI智能名片商城小程序:重塑品牌曝光的创新推手

摘要&#xff1a;随着移动互联网技术的飞速发展&#xff0c;小程序作为一种轻量级应用形态&#xff0c;正逐步成为企业品牌传播与商业变现的重要渠道。本文将探讨在品牌定位中&#xff0c;如何将“定制开发AI智能名片商城小程序”作为品牌曝光的核心推手&#xff0c;通过强化品…

力扣 | 最长公共子序列 | 动态规划 | 最长公共子序列长度、最长公共子序列

文章目录 一、1143. 最长公共子序列二、求最长公共子序列三、变式一、1035. 不相交的线二、1312. 让字符串成为回文串的最少插入次数 一、1143. 最长公共子序列 LeetCode&#xff1a;1143. 最长公共子序列 这是一道典型的二维动态规划问题&#xff0c;甚至面试都能被面到。 这…

c++ | 模板进阶

前言 本篇博客讲解c中的模板的一些其他知识 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢…

推荐一个国内Midjourney镜像站,限时充值享5折优惠 结尾附实测图片

作为一名绘画爱好者&#xff0c;你是否曾梦想过将脑海中的画面转化为现实&#xff1f;现在&#xff0c;有了群嘉智创平台&#xff08;ai.qunzjia.cn&#xff09;&#xff0c;这一切都将成为可能。群嘉智创是国内领先的AI对话与Midjourney绘画服务平台&#xff0c;通过接入国内多…

[Meachines] [Easy] Legacy nmap 漏洞扫描脚本深度发现+MS08-067

信息收集 IP AddressOpening Ports10.10.10.4TCP:135,139,445 $ nmap -p- 10.10.10.4 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn Microsoft Windows n…

论文阅读1 Scaling Synthetic Data Creation with 1,000,000,000 Personas

Scaling Synthetic Data Creation with 1,000,000,000 Personas 链接&#xff1a;https://github.com/tencent-ailab/persona-hub/ 文章目录 Scaling Synthetic Data Creation with 1,000,000,000 Personas1. 摘要2. 背景2.1 什么是数据合成2.2 为什么需要数据合成2.3 10亿种人…