当前位置: 首页 > news >正文

深度理解指针(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)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 探索Unity3D URP后处理在UI控件Image上的应用
  • 使用cbsd指令快速创建bhyve Ubuntu虚拟机实践
  • Apache CloudStack Official Document 翻译节选(八)
  • IO进程线程8月22日
  • EasyExcel动态实现表头以及数据封装
  • 树莓派开发笔记10-树莓派的HTTP通信实验
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector
  • 【YOLO5 项目实战】(6)YOLO5+StrongSORT 目标追踪
  • 再学C++(一):C++中类与结构体的区别
  • 【C++ Primer Plus习题】2.6
  • 模型优化之剪枝
  • libevent之android与鸿蒙编译过程
  • H3C M-LAG与双活网关接口结合应用场景实验
  • 数据结构-链表-第二天
  • elasticsearch的高亮查询三种模式查询及可能存在的问题
  • 【技术性】Search知识
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CentOS 7 修改主机名
  • JavaScript-Array类型
  • PHP变量
  • Python中eval与exec的使用及区别
  • vue2.0项目引入element-ui
  • 测试开发系类之接口自动化测试
  • 多线程 start 和 run 方法到底有什么区别?
  • 关于Flux,Vuex,Redux的思考
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 讲清楚之javascript作用域
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 译自由幺半群
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 第二十章:异步和文件I/O.(二十三)
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #Linux(make工具和makefile文件以及makefile语法)
  • #QT(TCP网络编程-服务端)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #控制台大学课堂点名问题_课堂随机点名
  • #数据结构 笔记一
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $jQuery 重写Alert样式方法
  • (1)Hilt的基本概念和使用
  • (26)4.7 字符函数和字符串函数
  • (30)数组元素和与数字和的绝对差
  • (done) 两个矩阵 “相似” 是什么意思?
  • (libusb) usb口自动刷新
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (纯JS)图片裁剪
  • (含笔试题)深度解析数据在内存中的存储
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转载)从 Java 代码到 Java 堆
  • ../depcomp: line 571: exec: g++: not found
  • .net 8 发布了,试下微软最近强推的MAUI