首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么要将一个数组作为一个实际的参数发送给函数,它需要一个指向数组的指针,需要两次取消引用才能访问该数组?

将一个数组作为实际参数发送给函数时,需要一个指向数组的指针,并且需要两次取消引用才能访问该数组的原因如下:

  1. 数组在内存中的存储方式:数组在内存中是连续存储的,即相邻元素在内存中的地址是连续的。通过指针可以获取数组在内存中的起始地址,从而访问整个数组。
  2. 数组传递给函数的方式:在函数调用时,参数传递可以通过值传递或引用传递。对于数组来说,传递数组的地址(指针)比传递整个数组更高效,因为传递整个数组会涉及到数据的复制,而传递指针只需要传递一个地址。
  3. 指针的作用:通过指针可以间接访问数组元素,即通过指针的地址定位到数组的起始地址,再通过偏移量访问数组中的元素。因此,将数组作为参数传递给函数时,需要一个指向数组的指针。
  4. 取消引用的目的:取消引用指针即获取指针所指向的值。在访问数组时,需要先取消引用指针获取数组的起始地址,然后再通过偏移量访问数组中的元素。

综上所述,将一个数组作为实际参数发送给函数时,需要一个指向数组的指针,并且需要两次取消引用才能访问该数组,这是因为数组在内存中的存储方式和指针的作用所决定的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

面试总结-C++

为什么不能建立引用数组引用作为函数参数时,可以避免对变量或者对象复制,因此不会调用对象拷贝构造函数。当不希望传入引用参数不被改变时,使用const引用。...例如,被函数返回引用只是作为一个临时变量出现,而没有被赋予一个实际变量,那么这个引用指向空间(由new分配)就无法释放,造成内存泄露。)。 可以返回类成员引用,但最好是const。...- int (*p)(int)是函数指针,强调是指针指针指向函数具有int类型参数,并且返回值是int类型。 ##### 指针数组名 - 二者均可通过增减偏移量来访问数组元素。...C++/C 语言没有办法知道指针所指内存容量,除非在申请内存时记住。注意当数组作为函数参数进行传递时,数组自动退化为同类型指针。...访问时间,访问一个具体单元,需要两次访问内存,第一次得取得指针,第二次才是真正得数据,而栈只需访问一次。 堆内容被操作系统交换到外存概率比栈大,栈一般是不会被交换出去

2.1K11

小白学算法-数据结构和算法教程:什么链表以及操作

节点结构:链表中节点通常由两个组件组成: 数据:保存与节点关联实际值或数据。 下一个指针存储序列中下一个节点内存地址(引用)。 头尾:链表通过头节点访问,头节点指向链表中一个节点。...链表最后一个节点指向NULL或nullptr,表示链表结尾。节点称为尾节点。 为什么需要链表数据结构? 下面列出了链表一些优点,它将帮助您理解为什么有必要了解。...动态数据结构:可以在运行时根据操作插入或删除来分配或取消分配内存大小。 易于插入/删除:元素插入和删除比数组简单,因为插入和删除后不需要移动元素,只需更新地址。...灵活性:链表可以轻松地重新组织和修改,而不需要连续内存块。 链表缺点 随机访问:与数组不同,链表不允许通过索引直接访问元素。需要遍历才能到达特定节点。...额外内存:与数组相比,链表需要额外内存来存储指针。 插入链表 给定一个链表,任务是在这个给定链表中以下位置插入一个新节点:  在链表最前面   在给定节点之后。  位于链表末尾。

12430

【C语言总集篇】指针篇——从不会到会过程

,所以对于数组指针变量我们可以写成以下形式: 当我们通过两次引用操作来访问变量a中存放数据时,此时数组指针就和二级指针类似; 当我们通过两次下标引用操作符来访问变量a中存放数据时,此时数组指针就和二维数组类似...为了进一步验证这个结论,我们来进行以下测试; 通过数组下标访问数组各个元素 此时我们通过两次引用不管是使用数组名还是指针名都成功访问到了数组各每个元素; 通过解引用操作访问二维数组各个元素 通过解引用操作...这里要注意是,对函数指针类型重命名时,我们需要将名字放在指针标志括号内才能完成重命名; 16.5 有趣代码 下面我们来看两个有趣代码: //代码1 (*(void(*)())0)(); 这个代码是在干啥呢...signal这个函数它有两个参数——一个是int类型,一个函数指针类型; 那它实际上是数据类型 标识符(参数类型,参数类型),这个格式是函数声明格式。...如下所示: 当然,我们在实际使用时调用函数数量是根据实际情况而定,只要被调用函数满足以下三个条件即可通过函数指针数组来进行调用: 函数具有相同返回类型 函数具有相同参数数量 函数具有相同参数类型

24510

指针(2)--指针数组

我们需要知道一个很重要事实是: 数组其实就是指针底层含义就是地址。 从1中我们也得知数组名就是其首元素地址。...4.二级指针/多级指针 指向一个变量地址就是指针,当这个变量本身不是指针时,那么这里指针叫做一级指针。 我们知道,指针变量是指向某一类型数据内存地址变量,作为变量本质是不会改变。...所以指针变量地址就叫做二级指针。它是指向指针指针。 那么如果我们要通过pp来找到或者改变a变量,就要解引用两次。...数据类型不同 普通数组数据类型是普通类型,但指针数组数据类型实际上是普通类型再加上*号,用来表明数据是指针。 2....毕竟只需要获取指针就可以访问数据,也就可以模拟实现二维数组了。 注意:上述代码模拟出二维数组效果,实际上并非完全是⼆维数组,因为每⼀行并非是连续。 4.

6810

【C语言】深入解开指针(四)

具体来说: 二维数组名代表整个二维数组其实就是一维数组指针指向数组首行地址。 当二维数组作为参数传递给函数时,它会自动退化为一维数组指针。...,它也需要指向具体函数地址才能调用该函数。...由于指针指向0地址,实际调用是内核NULL地址下代码。这通常会触发异常或者崩溃。 所以这个代码展示了一个通过函数指针调用匿名函数语法,实际上是在尝试访问指针代码从而触发错误。...第二个是函数指针类型,指针指向函数参数是int,返回类型是void signal函数返回类型是这种类型void(*)(int)函数指针 指针指向函数参数是int,返回类型是void 细节分析拓展如下...实际应用中,可以通过函数指针数组实现回调函数、插件等机制。函数也可以作为参数传递给其他函数。 总之,函数指针数组提供了一种灵活高效方式来管理和调用多个函数在C语言中。怎么高效?

11010

指针详解(二级指针指针数组数组指针、字符指针、二维数组传参、函数指针变量)(二)

每行实际上是一个指向整数数组指针,这些整数数组可能在内存中是分散。 2、性能:由于内存布局原因,使用指针数组模拟二维数组访问特定元素时可能需要更多计算,这可能会影响性能。...:当你在写函数时,如果你想让函数操作一个数组,你可以将数组指针作为函数参数传递。...:在很多情况下,我们需要将一个函数作为参数传递给另一个函数。...;//是一个函数声明 1.signal是一个函数声明 2.signal函数参数有两个,第一个是int类型, 第二个是函数指针类型,指针指向函数参数是int,返回类型是void signal...函数返回类型是这种类型void(*)(int)函数指针 指针指向函数参数是int,返回类型是void 3.signal函数返回类型也是一个函数指针: void(*)(int) 这个函数指针指向函数参数

23710

C++ 面试必备:常见 C++ 面试题汇总及详细解析

内存用法 数组名是一个指向数组首元素常量指针存储数组首元素地址。而指针一个变量,存储是某个对象地址。...函数参数传递 如果将数组作为函数参数传递,实际上传递一个指向数组首元素指针。而如果将指针作为函数参数传递,可以方便地修改指针指向对象。...数组引用 可以通过数组下标访问数组元素,也可以使用指针进行访问,但是需要注意是,使用指针访问数组元素需要先将指针引用,即使用 * 运算符。例如:*p 表示 p 指向对象。...C++函数调用是编程中常见一个操作,其过程可以分为以下几个阶段: 函数调用前准备工作 在函数调用之前,需要进行一些准备工作。首先,需要将函数参数压入栈中,以向函数传递参数。...函数将根据其实现过程来计算参数并进行其他操作,然后返回一个结果,结果通常被保存在寄存器中。 函数返回 当函数执行完毕时,需要将返回值存储,并恢复主函数栈帧及处理状态。

1.9K30

深入解析C语言数组指针(0)

对于一个NULL指针进行解引用是非法,因为并未指向任何东西。如果你知道指针将被初始化为什么地址,就把初始化为该地址,否则就把初始化为NULL。...作为函数参数数组名 通过前面的学习我们知道,数组值就是指向数组一个元素指针。所以当一个数组作为参数传递给一个函数时,此时传递给函数是一份指针拷贝。...声明数组参数   对于把数组名当作参数函数,因为调用函数实际传递一个指针,所以函数形参实际上是个指针,所以以下两个声明都是正确: int strlen (char *string );...int strlen( char string[]);   值得注意是第一种声明无法知道数组长度,所以函数如果需要知道数组长度,必须作为一个显式参数传递给函数。...下面的两个声明都是使p2指向a2一个整型元素: int *p2=&a2[0][0]; int *p2=a2[0]; 作为函数参数多维数组 作为函数参数多为数组传递方式和一维数组相同

1.3K30

iOS开发--我与面试官有个约会

观察者是用cfrunloopobservecreate来创建,我们设置监听所有属性,方法还有一个传入函数指针参数,那我们就可以传入一个方法,这个方法就是监控runloop状态改变。...block是将函数及其上下文封装起来对象 block指向一个名为__方法名_block_impl_0结构体。并传入了参数函数指针,关于block描述,局部变量。最终强转为一个函数指针。...在添加弱引用变量时,最终会调用weak_register_no_lock(),根据hash算法进行查找,若查找位置已经有了当前对象对应引用数组,就把新变量添加到数组中,若无对应引用数组,...在对象调用dealloc时候,内部会最终会调用weak_clear_no_lock方法,它会更加当前指针查找弱引用表,把当前对象对应引用都拿出来得到一个数组,遍历数组所有弱引用指针,分别置为nil...将小于基准数数字移到基准数左边,大于移动到右边。对于基准数两边数组,不断重复以上过程。直到每个子集只有一个元素。即为全部有序。 定义两个指针i,j。i指向头部,j指向尾部。

2.5K40

C指针基础概览

**mypp拥有两个解引用符,第一个引用符去除mypp中存储myp地址,第二个解引用符取出myp中存放x值,对mypp二次解引用操作会将变量x内存取出,并使用参数“%d”指定了内容大小为...其奥秘在于,声明一个指针需要指定指向数据类型。C语言声明指针格式通常为 “指向数据类型* 变量名”。...15 程序中mysum函数接受2个参数,第一个参数数组长度,第二个参数指向数组指针,目前没有较好检查C语言数组访问越界问题,所以最好办法就是把数组长度直接传给被调用函数。...函数指针 函数指针 C语言中数据变量无论是在程序栈还是堆中,都拥有自己内存地址,函数也一样,函数代码也需要调入内存才能够被执行,它们在内存中也拥有自己起始地址,因此可以定义指针指向函数,存储函数起始地址...文件指针及操作函数 C语言通常用一个指针变量指向一个文件,指针称为文件指针,通过文件指针就可以对指向文件进行各种操作。

99520

C语言灵魂——指针

为什么指针是强类型? **因为,**我们不仅使用指针来存储内存地址,同时也用来解引用他所存储地址所对应内容,这样我们就能访问并且修改这些地址对应值了。...当编译器看到数组作为函数参数时候,他不会拷贝整个数组,而是仅仅创建一个同名指针,我们这里就是创建了一个整型指针,编译器只是拷贝了主调函数数组首元素地址。...多维数组作为参数传给函数 (是几维数组,使用数组作为指针就返回几维度-1指针) (例如:一维数组返回指向整型指针,二维数组返回指向一维数组指针,三维数组返回指二维数组指针…) 多维数组作为函数参数时候...void*p = malloc(n*sizeof(int)); 我们不能解引用一个void指针,通常需要将它转化为一个特定类型指针,然后再使用它。...函数指针可以被用来作为函数参数,接收函数指针这个函数,可以回调函数指针指向那个函数, 就是一个函数作为参数传递给另外一个函数

87310

【C++】C++ 引用详解 ⑦ ( 指针引用 )

; 如 : 创建一个动态数组或调整现有数组大小 , 在函数需要一个指向指针指针作为参数 , 以便修改原始指针 ; void createArray(int **arr, int size) {...= &new_value; // 修改指针值 } 传递多维数组 : C 语言中 , 数组名本质上是指向数组一个元素指针 , 传递多维数组函数中通常需要传递一个指向指针指针 , 即二级指针...; 如果将 函数 形参类型 设置为 引用 类型 , 也能达到 间接赋值 效果 ; 引用 实际上是 把 间接赋值 三个条件后两个条件进行了合并 , C++ 编译器遇到引用 , 还是需要将 引用...还原为 C 语言中 取地址 传入函数 , 在函数内部使用指针访问实参 ; 3、代码示例 - 指针引用 函数 参数 是 一级指针引用 , 使用参数时 可以当做 一级指针使用 , 其效果...*& p) 调用 一级指针 引用 , 可以直接访问 一级指针 , 不需要使用 * 符号 ; 因此 这里 直接为 一级指针 进行内存分配 ; 如果此处是二级指针 , 需要先试用 * 符号 取出二级指针指向一级指针

29020

第七节(指针

函数在处理数组时,会查看每个元素值。当函数发现这个特殊值时,就意味着到达数组末尾。这个方法缺点是,必须预留一个作为数组末端指示符,在储存实际数据时不太灵活。...另一个方法相对灵活和直接,也是我采用方法:将数组大小作为实参传递给函数数组大小就是一个简单int值。因此,需要函数传递两个实参:一个指向数组首元素指针一个是指定数组元素个数整数。...这里只有一个新内容,即函数第1个形参: intnum_array[],表明第1个参数指向int类型数组指针,由形参num_array表示。...数组名是指向数组首元素指针。通过指针运算特性,可以很方便地使用指针访问数组元素。实际上,数组下标表示法就是指针表示法特殊形式。 本次还介绍了通过传递指向数组指针来将数组作为参数传递给函数。...&data[0]和data 11:如果要给函数传递一个数组,有哪两种方式让函数知道已到达数组末尾? 一种方法是,把数组长度作为参数传递给函数

17940

指针(二)

j) == p[i][j] 8 9在数组存储结构里就是第i行第j个元素 二、二级指针 指向指针指针,称为 二级指针 任何数据都有地址,一级指针值虽然是地址,但是这个地址做为一个数据也需要空间来存放...*pp 得到所指向一级指针地址,也就是p值 2 3二级指针两次引用 **pp 得到所指向一级指针指向值 也就是a值 二级指针指针数组 二级指针可以直接访问二维数组吗?...,和普通函数相比就是指针函数返回一个指针 函数指针 指向函数指针 定义格式:类型 (*指针名) (参数) 1int (*p)(int x, int y); 函数指针调用 1#include<stdio.h...main() 11{ 12 fun(add);//函数地址作为实参 13 return 0; 14} 可以思考下为什么要把一个函数地址作为参数传递给另一个函数,要知道在C语言中,一个函数内部是可以直接调用其他函数...,既然可以直接调用,为什么还要用这么麻烦办法去把函数当做参数来传递呢。

33140

独特视角解读JVM内存模型

把新生成对象引用压入栈中 10.通过解释器执行保存在方法区中当前类无参构造函数,并将A对象引用作为隐式参数传入方法,然后对当前实例对象进行初始化 对象实例初始化分为三步: 分配内存,调用对象构造函数进行初始化...好处: 有利于堆碎片整理,当移动对象池中对象时,句柄部分只需要更改一下指针指向对象新地址即可 缺点: 访问对象实例数据都要经过两次指针传递 另一种设计方式是使对象指针直接指向一组数据,组数据包括对象实例数据以及指向方法区中类数据指针...缺点: 移动对象变得更加复杂,必须在整个运行时数据区中更新指向被移动对象引用为什么虚拟机必须能通过对象引用得到类元数据?...对于一个实例方法调用而言,参数this总是作为隐式参数传入,它用来表示调用方法对象本身。...每当虚拟机要执行某个需要用到常量池数据指令时,都会通过帧数据区中指向常量池指针访问,以前讲过,常量池中对类型,字段和方法引用在开始时都是符号。

37720

【C进阶】——动态内存管理详解 及 经典笔试题解析

其次:数组在声明时候,需要指定数组长度,它所需要内存在编译时分配。 但是,对于空间需求,不仅仅是上述情况。有时候我们需要空间大小在程序运行时候才能知道。...参数void* ptr接收一个指针,这个指针指向我们使用malloc这些动态开辟内存函数分配内存块,无返回值。...然后返回指向内存块起始地址指针。 还要一点需要注意: 我们要知道realloc一个参数void* ptr 也可以接收一个指针,当接收是空指针时候,就相当于malloc了。...",p是数组名,是首字符’h’地址,将p作为返回值赋给str,那我们是不是就可以通过str访问数组p了,printf(str)就把"hello world"打印出来了。...为什么呢? 数组p是我们在函数内部创建一个局部数组,当函数调用结束就被销毁了,数组所在这块空间就还给操作系统了,那这时候我们再去打印这块空间里内容,是不是就非法访问内存了。

12510

程序员C语言快速上手——高级篇(十)

动态内存 内存分配在堆上,用完需手动释放,使用指针引用分配内存,作用域局限于引用内存指针 为什么需要在堆上面分配动态内存?...我们知道数组变量实际上也是一个指针指向数组起始地址,结构体指针也是指向一个成员变量起始地址,而函数指针亦是指向函数起始地址。 所谓函数指针,就是一个保存了函数起始地址指针变量。...而在Python、JavaScript等编程语言中,当前流行函数式编程范式,即将一个函数作为参数传入到另一函数中执行,实际上有些古老C语言中早就能实现了。...由此我们基本可以推断一个事实,指针用来保存变量内存地址与变量类型无关,任何类型指针都可以保存任何一个地址;指针之所以需要类型,只与指针引用有关。...如上例,*pInt解引用后结果错误,这就是因为原类型是short2字节,而使用int*指针去解引用会超出short本身两字节内存,将紧随其后两字节内存也强制读取了,访问了不合法内存空间,这实际上是内存越界造成错误值

1.4K30

C语言之一维数组

在C中,绝大多数时候(有例外情况,下文我们会讨论),数组名是一个指向XXX类型常量指针。例如num,类型应该是指向int类型指针常量。但是这并不是说数组指针是相同。...# 这个操作产生一个指向数组指针(int (*num) [3]),而不是一个指向某个指针常量指针。例如: ?...数组函数参数   数组函数参数时,我们一般将数组作为参数传递给函数,也就是说传递给了函数指向数组起始元素指针。因此很容易就明白了,这是把指针拷贝了一份,而非整个数组。...所以,我们说在C中所有传递给函数参数都是通过传值方式进行。因为,数组名在作为函数参数进行传递时候,实际一个指针。   不过编译器为了我们编写代码方便, 支持数组形式函数形参。...但是这在一维数组这里无关紧要。因为这传递指针,而不是整个数组,所以,如果函数需要知道数组长度,那么长度必须作为一个显式参数传递给函数

61520

导入:什么是数据结构,为什么要学习数据结构,约瑟夫环数组实现

int *p,a[10]; (2)指针指向数组 p = a; (3)通过指针引用数组元素 当指针指向数组首地址时,则下标为i元素地址为:p+i或a+i 引用数组元素也有三种方法: (1)...图2 图书数据     C语言允许用户按自己需要将不同基本类型构造成一种特殊类型,即结构体。 ? 图3 结构体定义格式 ?...、参数引用变量、参数数组) 1.参数引用变量 什么是引用?...printf("%d,%d",i,j);7,7 }     j是一个引用类型,带表i一个替代名,i值改变时,j值也跟着改变,再看一下传引用方式作为函数参数 代码示例: #include <stdio.h...: (1)传递引用函数与传递指针效果是一样,形参变化实参也发生变化 (2)引用类型做形参,在内存中并没有产生实参副本,直接对实参操作;而一般变量做参数,形参与实参就占用不同存储单元,所以形参变量值是实参变量副本

95950
领券