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

为什么在递增接收数组地址的指针时,其行为与已用该地址初始化的指针不同?

在递增接收数组地址的指针时,其行为与已用该地址初始化的指针不同的原因是因为指针的递增操作是基于指针所指向的数据类型的大小进行的。

当我们使用已用该地址初始化的指针时,指针会根据所指向数据类型的大小进行递增。例如,如果指针指向一个int类型的数据,那么递增指针时会将指针的值增加sizeof(int)个字节。

然而,当我们递增接收数组地址的指针时,指针会根据数组元素的数据类型的大小进行递增。这是因为数组是一系列相同类型的元素的集合,指针指向数组时,递增指针时需要按照数组元素的大小进行递增,而不是整个数组的大小。

这种行为的不同是由于指针的算术运算是基于指针所指向的数据类型的大小进行的。这样设计的目的是为了确保指针在递增时能够正确地指向下一个元素,而不会跳过或重复指向某个元素。

总结起来,递增接收数组地址的指针与已用该地址初始化的指针的行为不同,是因为指针的递增操作是基于指针所指向的数据类型的大小进行的,而数组元素的数据类型与指针所指向的数据类型可能不同。

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

相关·内容

第七节(指针)

在C程序中声明一个变量时,编译器会预留一个内存位置来储存该变量,此位置有唯一的地址。 编译器把该地址与变量名相关联。当程序使用该变量名时,将自动访问正确的内存位置。...递增大于1的值也是如此。 如果给指针加上n,那么C编译器将递增该指针的值是n与相应数据类型大小的乘积(即,如果指针加上n,则该指针指向后续第n个元素)。...第9行,MAX用于设置int类型的数组i_array 的元素个数。 在声明数组时已经初始化了数组的所有元素。...两个程序的不同在于,该程序使用了数组标记。 第37行的for循环不断查找最大值,直至元素的值是0 (0 表明己到达数组的末尾)。 该程序的前面部分与上面程序清单不同。...函数一旦知道数组的地址和数组的元素个数,便可使用指针表示法或下标表示法访问数组元素。 问答题 1:为什么在C语言中,指针很重要? 通过指针能更好地控制数据。

20140

计算机初级选手的成长历程——指针(6)

常量字符串与字符数组类似,字符串中的元素也是有对应的元素下标,并且下标是从0开始逐渐递增。当我们通过字符指针指向常量字符串时,指针指向的实质上是常量字符串的首元素地址。...下面大家可以根据这个观点回答以下两个问题吗: 为什么数组名与指针等价? 为什么解引用操作符与下标引用操作符等价? 为什么数组名与指针等价?...; 15.5.2 数组指针与指针数组的区别 在理解了数组与指针的区别后,我们再来看一下指针数组与数组指针的区别: 指针数组与数组指针的内存空间不同 从反汇编界面我们可以看到: 指针数组在申请空间时,会根据数组大小来申请对应数量的空间...; 数组指针在读取数据时,是先通过存储指向空间的起始地址找到对应的空间的起始位置,再通过空间编号找到对应的空间,最后通过对该空间的地址进行解引用找到空间中存储的数据; 现在我们知道了指针数组与数组指针是两个东西了...,我们也成功的访问到了二维数组的各个元素; 通过数组指针接收二维数组 我们在对二维数组进行传参时,数组指针很好的接收二维数组并成功通过下标对数组元素进行了访问; 4.通过二维数组接收数组指针 我们在对数组指针进行传参时

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

    经过这两次测试的结果,对于不同类型指针的意义,现在我们可以得到的结论: 不同类型的指针在进行+/-整数时,指针变化的值为对应类型所占空间大小与整数的乘积; 不同类型的指针在解引用时,对值修改可操作的字节大小为对应类型所占空间大小...,并不能对其进行解引用以及进行指针的运算; 下面我们来通过实例验证一下: 从报错中我们可以看到,void*类型的指针在接收不管是char类型还是int类型的对象的地址时都是没有问题的,但是我们在对其进行解引用...常量字符串与字符数组类似,字符串中的元素也是有对应的元素下标,并且下标是从0开始逐渐递增。当我们通过字符指针指向常量字符串时,指针指向的实质上是常量字符串的首元素地址。...下面大家可以根据这个观点回答以下两个问题吗: 为什么数组名与指针等价? 为什么解引用操作符与下标引用操作符等价? 为什么数组名与指针等价?...; 数组指针在读取数据时,是先通过存储指向空间的起始地址找到对应的空间的起始位置,再通过空间编号找到对应的空间,最后通过对该空间的地址进行解引用找到空间中存储的数据; 现在我们知道了指针数组与数组指针是两个东西了

    37010

    关于CC++ 一些自己遇到的问题以及解惑

    1.数组越界造成的死循环        有一位朋友在群里发了该代码,并说该代码导致了死循环??? ?        废话少说,上工具,我们来分析分析。 ?        ...再往下看,通过搜索,我了解到==导致死循环与编译器的内存分配有关,若内存递减分配会出现死循环,递增分配则不会,==并通过在不同IDE输出内存地址,确实验证这个结论成立. ?        ...那么为什么会产生这样的效果呢,揭秘如下. 若是内存递减分配,对于数组和i的内存分配如下: ? 若是内存递增分配,对于数组和i的内存分配如下: ?        ...,元素为指针 int (*p)[];              数组(样式的)指针 本质是指针 上面出现的括号都是必要的,不可省略,说其是一种格式也不为过,指针XX和XX指针分不清主次,可以像我一样在两者之间加上...当自定义函数中无返回值时,可以使用该写法。相当于使用了break。 return 0; 当函数有返回值时,使用该写法。

    67641

    第九节(结构、联合typedef)

    与所有的指针一样,不能使用未初始化的指针。 如果在声明时没有初始化,可以稍后为其赋值后再使用。 记住,要把变量的地址赋给指针。...第34^39行,使用for循环来打印数组中所有的元素,每次迭代便递增p_part指针。 该程序还同时显示了每个元素的地址。 仔细查看显示的地址。...你的计算机上显示的地址可能本例显示的不同,但是两相邻地址间的差值应该相同一都等于part结构的大小。 这清楚地解释了为指针递增1,指针中储存的地址便自动递增该指针所指向数据类型的大小。...不要忘记,为指针递增1,该指针中储存的地址便自动递增它指向数据类型的大小。 如果指针指向一个结构,则递增一个结构类型的大小。 六:联合 联合(union )与结构类似,它的声明方式与结构相同。...联合与结构不同的是,同一时间内只能使用一个联合成员。原因很简单,联合的所有成员都占用相同的内存区域一它们彼此擦写 。 6.1 声明、定义并初始化联合 联合的声明和定义的方式与结构相同。

    24220

    【C语言必学知识点七】你知道在动态内存管理中存在的内存泄露问题吗?遇到内存泄露时应该如何处理?今天跟你好好介绍一下如何正确使用calloc与realloc!!!

    ,我们可以提炼出以下信息: calloc是为数组申请的空间,并且数组中的元素会被初始化为0 calloc会调用malloc来完成空间的申请 calloc在申请空间时需要指定数组元素的个数以及每个元素的大小...但是当我们在进行空间分配时是执行的扩容操作,那么就会有以下两种情况: 源空间足够扩容realloc会在源空间的基础上直接扩容,该空间的起始地址为原先的起始地址; 源空间不够扩容realloc会在内存中重新申请一块空间...基于这种空间可移动的特性,因此当我们传入的指针为一个空指针时,就相当于对一个大小为0且没有任何元素的空间进行扩容,这时realloc就会直接在内存中申请一块大小足够的空间,然后返回该空间的起始地址,这个行为就和...既然空间申请失败的情况下,原空间是不变的,那么如果我们直接通过指向原空间的指针来接收扩容后的地址,势必就会造成一个问题——空间泄漏。...很简单,我们只需要在进行扩容时通过一个临时的指针来接收realloc的返回值即可,如下所示: 可以看到,当我们要通过realloc来进行扩容时,我们这里借助了一个临时的指针tmp用于接收realloc扩容后的返回值

    11610

    关于我、重生到500年前凭借C语言改变世界科技vlog.11——深入理解指针(1)

    不一定非要用指针吧,确实在当前情况下使用指针略显麻烦,但是在程序代码更加复杂,或者是不同的操作情景下,指针是一种妙用,后续的实例将会逐步深入理解指针的必要性和实用性 4.指针变量类型的意义 指针变量的大小与类型无关...,只与操作平台有关,在同一平台下,大小都是一样的,那么指针类型的意义在哪儿呢?...*指针 void* 指针是一种特殊的指针,他没有特定的类型,不像int*、char那样指向特定的数据所在的内存地址,但也是有指向地址的,不过是对其指向的内容类型,或进行操作时的方式不明确,即void指针不能进行解引用操作和加减整数操作...,当把字符串常量作为参数传递给函数时,实际上传递的就是这个字符数组的首元素(也就是首字符)的地址 在 my_strlen 函数内部,通过这个接收到的地址(形参 s),就可以从字符串的开头开始逐个访问字符...,当一个指针被赋值为 NULL 时,意味着该指针当前没有指向任何有意义的对象或者内存区域) 4.不要返回局部变量的地址 8.assert 的断言 assert.h 头文件定义了宏 assert()

    7500

    2021腾讯实习一面复盘-小丑竟是我自己

    Struct 数据对齐原则:内存按结构成员的先后顺序排列,当排到该成员变量时,其前面已摆放的空间大小必须是该成员类型大小的整倍数,如果不够则补齐,以此向后类推。 各成员间互不影响。...,默认初始化为0,使用时可以改变其值。...接收方按序接收分组。当收到失序的分组,它会丢弃,并对按序的分组进行确认。 接收方采用累计确认的方式。在收到n个分组之后,对按序到达的最后一个分组进行确认。...容量限制,注意上次是否读完 共享内存 银蛇一块可被其他进程所访问的内存,快,同步问题 信号 通知接收进程某个事件已经发送 套接字 可用于不同机器间进程通信 物理地址和虚拟地址的区别 物理地址:CPU...地址总线传来的地址,由硬件电路控制其具体含义。

    58320

    C语言——指针(1)

    一.地址与指针 在计算机中,数据都是存放在内存中的,不同的数据类型所占用的内存空间并不相同。...在同样的环境下(32位或64位),不同类型的指针变量大小是一样的。 四.指针类型的意义 1.指针的类型决定了对指针解引⽤的时能访问多少个字节。...七.野指针 野指针形成原因: 1.指针未初始化。 2.指针越界访问。 3.指针指向的空间释放。 1. 切记指针要初始化!!! 2. 关于指针的越界访问,可以通过下面指针访问数组的例子说明。...对于指针指向的空间释放,我们看下面这个关于函数的例子。 上面的p指针就是野指针,其指向的内存已经释放。为什么?...1.指针初始化 在实际写代码过程中,如果我们知道指针指向哪里,那就直接让指针接收地址。 如果不知道,可以给指针赋值NULL。

    7910

    面试常考知识点总结——面试必看

    哈希表查询时的时间复杂度为多少? 答:数组+链表,主干为数组,当某个节点出现多次时,则用链表组织这些相等的节点。...;第二种方法是,在固定的偏移位置写入报文长度,接收方每次读取先获取到报文的长度,再接收该长度大小的报文即可。...函数体static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值 在模板内的static全局变量可以被函数内所有函数访问,但不能模板外其他函数访问...引用时别名;指针是地址 程序为指针变量分配内存区域,而不为引用分配内存区域。 指针使用时要在前加 * ,引用可以直接使用。 引用在定义时就被初始化,之后无法改变;指针可以发生改变。...int **p //合法 int &&p //非法 ++引用与++指针的效果不一样。

    85620

    《C++Primer》第十二章 动态内存

    动态内存和智能指针 在c++中,动态内存的管理是通过一对运算符来完成的: new:在动态内存中为对象分配空间并返回一个指向该对象的指针 delete:接收一个动态对象的指针,销毁该对象并释放与之关联的内存空间...释放一块非new分配的内存或者将相同的指针释放多次,其行为是未定义的。...有一种可以避免空悬指针的做法:在指针即将离开其作用域之前释放掉它所关联的内存,这样在指针关联的内存被释放掉之后,就没有任何机会继续使用指针了。...如果我们在delete一个指向数组的指针时忽略了方括号,或者在delete一个指向单一对象的指针时使用了方括号,其行为是未定义的。 3....,使用未构造的内存,其行为是未定义的。

    1.4K10

    【数据结构&&C语言】【入门】【首次万字详细解析】入门阶段数据结构可能用到的C语言知识,一章让你看懂数据结构!!!!!!!

    字符数组ch2和ch3的初始化监视图 解答:监视图可知,两者书写方式虽然不同,但是储存形式是相同的,所以在初始化书写中,是一样的,但要注意的是ch2中的字符是单引号'a',ch3中的数组是双引号""...所以函数形参的部分理论上应该使用指针变量来接收首元素的地址。 那么在函数内部我们写sizeof(arr) 计算的是⼀个地址的大小(单位字节)而不是数组的大小(单位字节)。...正是因为函数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。 那形参为什么可以写成数组的形式呢?...在32位的平台上运作时,指针变量的大小为4。 !在64位的平台上运作时,指针变量的大小为8。 为什么捏???...传递结构体地址时:只需创建4个字节结构体指针变量,通过其来访问结构体成员,可以大大节省空间。(本质上是地址/指针传递)。 推荐传递结构体地址。

    13010

    内存之谜:C语言动态内存管理

    为什么要进行动态内存分配 动态内存分配允许程序根据实际需要来分配内存。这意味着程序可以根据不同的输入和条件来处理不同大小的数据结构,如数组....它的作用是在堆上分配指定字节数的未初始化内存,并返回指向这块内存的指针。如果分配成功,将返回一个指针,该指针可以被转换为适当类型的指针以访问该内存区域。如果分配失败,将返回一个 NULL 指针。...在释放指针指向的内存后立即将指针置为 NULL; calloc函数 calloc函数用来动态地分配内存,并初始化所有字节为零。这与 malloc 函数不同,malloc分配的内存含有未定义的值。...当 GetMemory 函数返回时,它返回的是数组 p 的地址。 但是,一旦 GetMemory 返回,其栈帧(包括 p)将被销毁。因此,返回的地址指向一个已经不再有效的内存区域。...与柔性数组相比,这种方法需要额外的一个 malloc 调用来分配指向的数据,并且在释放时,需要分别释放数据和结构体本身。

    11710

    数组不可以直接赋值,为什么结构体中的数组却可以?

    数组与指针的暧昧关系 很多人都这样记忆:数组名就是数组开始地址的指针。这是不对的,或者说不严谨的。 在 C/C++ 中,数组就是数组,指针就是指针。...第二个 printf 中,a 就表示一个数组,与指针没有半毛钱的关系,前面加上取地址符 &,就表示获取这个数组所在的地址,这个地址与第一个元素的地址是重合的。...} } 形参 arr 在形式上好像是一个数组,实际上被编译器当做指针,也就是相当于:void func(int *arr),因此,在 printf 打印语句中,可以对 arr 进行递增操作。...为什么结构体中的数组可以复制 有了前面的语法标准,这个问题似乎不用再讨论了~~ 赋值的目的是什么?就是让一块内存空间的内容,与另一块内存空间中的内容完全相同。...参数传递和返回值 在调用函数时,实参到形参的传递; 函数执行结束后的返回值; 这两个场景中都涉及到变量的赋值问题。 关于参数传递,上面已经说了:编译器是把形参当做普通的指针类型的。

    3.8K30

    计算机初级选手的成长历程——指针(1)

    1024; 程序猿可以通过取地址操作符&将操作对象的地址取出来; 程序猿可以通过解引用操作符*将地址中存放的值取出来; PS:上述知识点在数组、函数栈帧的创建与销毁以及操作符篇章中都有详细介绍; 【数组篇章...\的理解,我是理解成钥匙孔,在介绍&和\这两个操作符时,我有提到过,取地址操作符就相当于是取出门牌号,而解引用操作符就是门的钥匙,那现在我们从指针的数据类型就可以知道了为什么是*而不是#甚至是其它的符号...,我们来看看不同类型的指针都会有哪些差异; 3.1 指针 '+'/'-' 整数 因为指针存储的是地址,所以指针加减整数实质上就是地址进行整数的加减,为了更加直观的看到其变化,我们通过打印格式%p——以地址的形式打印...经过这两次测试的结果,对于不同类型指针的意义,现在我们可以得到的结论: 不同类型的指针在进行+/-整数时,指针变化的值为对应类型所占空间大小与整数的乘积; 不同类型的指针在解引用时,对值修改可操作的字节大小为对应类型所占空间大小...4.4 指针越界访问 当我们正常的给指针初始化后,也可能出现野指针的情况,如下所示: 在这个代码中,对于数组arr来说,它的空间内只有3个元素,我们通过数组名将数组的首元素地址赋值给变量p后,变量p在进行对地址内容修改时

    15110

    【C语言】万字速通初阶指针 zero → One

    因为指针变量是指向一个变量的地址,所以将一个变量的地址值 赋值给这个指针就 "指向" 了该变量 例如:将变量 i 的地址值赋值给指针变量 p 中,p 就指向 i,其关系如下所示↓ 在程序代码中是通过...如下代码所示 a+b 其含义是:根据变量名与地址的对应关系,找到变量 a 的地址。...为什么不同类型的变量的地址所占的字节数都是一样的呢。 原因是:他们数据类型都是指针类型,切记(☆-v-) 注意→这个是在32位的操作系统 = 4字节,64位的操作系统上 = 8字节。...指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。...* p = arr; //接收arr数组首元素的地址。

    1.2K50

    JVM 中对象咋创建啊,又怎么访问啊

    (后面在虚拟机执行章节中有具体的加载过程笔记),然后检验其是否被初始化(这个初始化是指的类初始化,也就是执行)过 类加载完成确定类的内存大小 在新生代分配内存 执行构造函数,返回引用地址 简单总结:类初始化...分界点指示器 在 已用内存 和 未用内存 之间。...指针碰撞 的功能,其在空闲列表中申请内存时会申请较大的一块区域,然后对这块区域是 指针碰撞 来分配。...使用内存 内存分配完之后, JVM 会将这部分区域的值置为0(这就是基本数据类型的默认值的实现),如果使用的是本地线程缓冲区的方案,在分配缓冲区时即已经置为了0,然后开始设置对象头的信息,包括类信息、元数据地址...这个类型指针指向方法区中该对象的元空间数据。 数组长度 之所以会单独区分出数组的长度信息,是因为 JVM 无法通过类的元空间数据得出对象的大小,所以单独记录数组对象的长度信息在对象头中。

    58410

    世界上最好的语言——Go

    var a int = 1 var p * int = &a 与c++不同,golang中的结构体指针和普通结构体变量,都是通过.运算符获得成员,所以指针变量使用起来与普通变量差别看起来不是很大,只是因为其代表的是指针的变量...,在使用Stu类型变量调用Stu指针类型的方法时,golang会自动将代码执行为(&variable).方法名;对应的Stu指针类型变量调用Stu类型方法时,会被执行为(*variable).方法名 函数变量...slice make用于为slice(动态数组),map 或 chan (管道)初始化内存空间,并返回该对象(不是指针类型)。...比如 //创建一个长度为5的int slice var a []int = make([]int ,5,10) //与数组不同的是slice变量在赋值(函数传参等)时是引用赋值,而不是复制 其中第三个参数是...,是只读类型 当我们通过ValueOf传递地址时,得到的value对象是指针对象,与原对象有密切关系 指针对象因为安全原因,不允许使用setXXX进行修改,所以需要通过Elem方法获得该指针对象对应的值对象

    89841

    【C++篇】C++类与对象深度解析(三):类的默认成员函数详解

    4.4 运算符重载的优先级与结合性 虽然我们可以改变运算符的行为,但其优先级和结合性与内置类型运算符保持一致。这意味着我们不能通过重载运算符来改变它们的运算顺序。...4.5.3 前置和后置递增运算符的重载 在C++中,递增运算符++可以有两种形式:前置递增和后置递增。它们的功能类似,但实现方式不同。 前置递增:先递增,然后返回递增后的值。....* 的行为在 C++ 语言中已经固定,主要用于通过对象访问其成员指针所指向的成员。 示例:尝试重载 ....需要注意的是,赋值运算符重载与拷贝构造函数是不同的,拷贝构造用于初始化一个新对象,而赋值运算符则用于给已经存在的对象赋值。...效果:const实际修饰的是成员函数中隐含的this指针,表示在该成员函数中不能对类的任何成员进行修改。

    12610

    C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

    指针是一个变量,存储的是一个地址,引用跟原来的变量实质上是同一个东西,是原变量的别名 指针可以有多级,引用只有一级 指针可以为空,引用不能为NULL且在定义时必须初始化 指针在初始化后可以改变指向...;不同类对其const数据成员的值可以不同,所以不能在类中声明时初始化。...&a是数组的指针,其类型为int (*)[10](就是前面提到的数组指针),其加1时,系统会认为是数组首地址加上整个数组的偏移(10个int型变量),值为数组a尾元素后一个元素的地址。...30、拷贝初始化和直接初始化? 当用于类类型对象时,初始化的拷贝形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数。...如果该变量是一个寄存器变量或者表示一个端口数据或者是多个线程的共享数据,就容易出错,所以说volatile 可以保证对特殊地址的稳定访问。 37、为什么析构函数一般写成虚函数?

    2.2K20
    领券