首页 > 其他分享 >深入理解指针3

深入理解指针3

时间:2024-11-03 12:46:30浏览次数:3  
标签:arr 元素 数组名 地址 理解 深入 数组 指针

1. 数组名的理解

2. 使⽤指针访问数组

3. ⼀维数组传参的本质

4. 冒泡排序

5. ⼆级指针

6. 指针数组

7. 指针数组模拟⼆维数组

1.数组名的理解

我们在上面的图中就可以看见。

这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且 是数组⾸元素的地址,我们把这两种取出首元素地址的不同的方式来进行打印,可以看见&arr[0]和arr取出来的都是第一个元素的地址,

%p是用来打印地址的。

看看上面的图,我们以前说过的,sizeof可以拿来测量数组的大小,单位是字节,但是细心的你就会发现,arr不也是数组的名字吗,那这里显示的不是第一个数组元素的地址吗,一个整型元素的地址要么是4个字节,要么是8个字节,但是,打印出来的确实是这个数组所占据的字节数,事实上

其实数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外:

• sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩, 单位是字节

• &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素 的地址是有区别的)

找一个好学的同学来试一下这个代码,打印出来的结果你就会发现,哎,这三个结果都是一样的,因为前两个都是一样的,都是首元素的地址,最后一个是整个元素的地址,但是我们之前讲过了

数组的地址是由低到高的进行分配的,那么就会取出最小的地址,就是首元素的地址。

接下来我们再来看看这个

我们来看看打印的结果是什么

这⾥我们发现&arr[0]和&arr[0]+1相差4个字节,arr和arr+1相差4个字节,是因为&arr[0]和arr都是 ⾸元素的地址,+1就是跳过⼀个元素。 但是&arr和&arr+1相差40个字节,这就是因为&arr是数组的地址,+1操作是跳过整个数组的。

2. 使⽤指针访问数组

接下来我们尝试使用指针来打印数组的内容

第二种情况中,指针在最后可能会越界,但是没有问题,我们不会使用它。

3. ⼀维数组传参的本质

这就要学习数组传参的本质了,上个⼩节我们学习了:数组名是数组⾸元素的地址;那么在数组传参 的时候,传递的是数组名,也就是说本质上数组传参传递的是数组⾸元素的地址

在上图中我们看见了,如果我们在函数内部进行打印的话,我们是打印不出来的,因为数组传参

我们发现在函数内部是没有正确获得数组的元素个数。

所以函数形参的部分理论上应该使⽤指针变量来接收⾸元素的地址。那么在函数内部我们写 sizeof(arr) 计算的是⼀个地址的⼤⼩(单位字节)⽽不是数组的⼤⼩(单位字节)。正是因为函 数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的

传过来的是第一个元素的地址,那么传参的实质就是指针,传过来的就不是整个数组,那么我们也就并不知道这个数组到底有多少个,元素,那么我们,想要在函数内部打印整个数组元素,我峨嵋你就必须现在main函数内部进行计算,再传过去

4. 冒泡排序

冒泡排序的核⼼思想就是:两两相邻的元素进⾏⽐较。

5. ⼆级指针

这个问题简单

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?

指针变量就是用来存放普通变量的地址的,那么什么东西来储存指针变量的地址呢?

这就是二级指针。

我们来看上图,a是一个普通变量,而p是为了存放普通变量a的指针变量,而pp为了存放指针变量p的指针变量,pp就是一个二级指针。

*ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa , *ppa 其实访问的就是 pa

6. 指针数组

指针数组是指针还是数组?

我们类⽐⼀下,整型数组,是存放整型的数组,字符数组是存放字符的数组。

那指针数组呢?是存放指针的数组。

7. 指针数组模拟⼆维数组

这张图片中,我们让指针数组的每一个整型指针类型来接收一个数组名,也就是接受一个数组首元素的地址,3个整型元素接收了三个数组首元素的地址,构成了一个二维数组。        

标签:arr,元素,数组名,地址,理解,深入,数组,指针
From: https://blog.csdn.net/daiwoliyunshang/article/details/143463400

相关文章

  • C++中的内联函数:深入解析与应用
    C++中的内联函数:深入解析与应用在C++编程中,内联函数(InlineFunction)是一种优化手段,旨在通过在编译时将函数调用替换为函数体本身,以减少函数调用的开销,从而提高程序的执行效率。内联函数的使用需要谨慎,因为它虽然能带来性能上的提升,但也可能导致代码膨胀和编译时间增加。本......
  • 理解卷积神经网络
    人工智能 (AI)世界正在快速发展,AI越来越多地支持以前无法实现或难以实现的应用。什么是卷积神经网络?神经网络是一种系统,或者说是神经元的结构,它使人工智能能够更好地理解数据,从而解决复杂的问题。虽然网络类型多种多样,但本系列文章将仅关注卷积神经网络(CNN)。CNN的主要应......
  • 异步编程的利之Future模式深入解析(In Depth Analysis of Future Patterns)
     ......
  • 三数之和(双指针法)
    给你一个整数数组 nums ,判断是否存在三元组 [nums[i],nums[j],nums[k]] 满足 i!=j、i!=k 且 j!=k ,同时还满足 nums[i]+nums[j]+nums[k]==0 。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例1:输入:nums=[-1,0,......
  • Docker和k8s核心概念(理解友好版)
    背景这是在HWL负责网校云业务线测试时,给同事分享的基础概念文档。目录:一.Docker核心概念二.Kubernetes是什么及架构三.Kubernetes核心概念四.Deployment部署Pod操作一、Docker核心概念 1、为什么是Docker虚拟机:基础设施(Infrastructure)。服务器,或者是云主机。主......
  • 对补码的理解
    计算机的本质就是计算,只不过和人不一样的是:我们是用十进制数计算,而计算机是用二进制数计算。基本的运算规则就是四则运算:加减乘除。那么如何用二进制数进行四则运算呢?和用十进制数运算的方法一样吗?第一个层面,我们要理解一个十进制数如何化成二进制数。比如十进制数16用二......
  • (C语言)指针(全网最详细)
    1)内存和地址内存的使用和管理1.内存划分为一个个的内存单元,每个内存单元的大小是一个字节;而每个内存单元都有自己的编号;内存单元的编号==地址==指针;一个字节相当于8个比特位(就好比一个寝室住8个人一样);在创建变量的本质就是向内存中申请空间,比如inta=10;表示向内存单元......
  • 两数之和(双指针法)
     给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1<=index1<index2<=numbers.length 。以长度为2的......
  • 深入剖析卷积神经网络中的卷积核
    深入剖析卷积神经网络中的卷积核前言一、卷积核的数学基础代码示例:简单的2D卷积操作二、卷积核的类型与作用1.边缘检测卷积核代码示例:Sobel算子2.模糊与平滑卷积核代码示例:高斯滤波器三、卷积核的实际应用四、卷积核的初始化与学习五、卷积核的挑战与优化六、卷积......
  • C++ 手撕--共享式智能指针(shared_ptr)的简单实现
    C++手撕--共享式智能指针(shared_ptr)的简单实现共享式智能指针(shared_ptr):#include<iostream>#include<mutex>usingnamespacestd;template<typenameT>classShared_ptr{private:T*ptr;int*ref_count;std::mutex*mtx;voidrelease(){......