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

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

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

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

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

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

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

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

相关·内容

第七节(指针

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

19640

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

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

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

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

    34310

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

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

    67541

    第九节(结构、联合typedef)

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

    22120

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

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

    58120

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

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

    84720

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

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

    1.4K10

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

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

    11010

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

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

    14910

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

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

    3.3K30

    【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 无法通过类元空间数据得出对象大小,所以单独记录数组对象长度信息在对象头中。

    57710

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

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

    10410

    世界上最好语言——Go

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

    87841

    C语言指针5分钟教程

    根据出现位置不同,操作符 * 既可以用来声明一个指针变量,也可以用作指针取值。当用在声明一个变量,*表示这里声明了一个指针。其它情况用到*表示指针取值。 &是地址操作符,用来引用一个内存地址。...通过变量名字前使用&操作符,我们可以得到变量内存地址。...val变量声明并初始化内存之后,通过变量名之前使用地址操作符&我们可以直接引用变量内存地址。 第8行,我们再一次使用*操作符来对指针取值,可直接获得指针指向内存地址数据。...可以注意到,第11行我们打印了int和void指针地址。它们现在指向了同样内存地址。所有的指针都存储了内存地址。它们类型只 取值起作用。...第19行非常有意思,在这里打印未初始化指针和NULL指针。值得注意是,未初始化指针是有内存地址,而且是一个垃圾地址。不知道这个内存地址 指向值是什么。这就是为什么不要对未初始化指针取值原因。

    1.1K50

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

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

    2.1K20

    由C语言过渡到C++敲门砖

    // 返回值不同不能作为重载条件,因为调⽤也⽆法区分 void fxx() {} int fxx() { return 0; } 全缺省参数无参函数 区别于构造函数,类外全缺省参数函数无参函数构成函数重载无法正常调用...(无法直接代替指针) 使用格式: 类型& 引用别名 = 引用对象; 引用特性 • 引⽤定义必须初始化 • ⼀个变量可以有多个引⽤ • 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体 定义初始化...为什么引用无法直接代替指针链表中,节点就是指针,无法用指针替代。...• sizeof中含义不同,引⽤结果为引⽤类型⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte) • 指针很容易出现空指针和野指针问题,引⽤很少出现,引⽤使...调用宏时候必须保证调用时写定义宏函数格式一样,如果多加了分号的话那调用时候就会因为缺少分号而报错; 为什么要加外面的括号?

    9110

    Go 基础面试题

    new(T)表达式创建了一个 T 类型新项,初始化为 T 类型零值,并返回地址,也就是一个类型为*T值。这对于值类型(如结构体和数组内存分配特别有用。...Go 语言中make函数专门用于分配并初始化类型为 Slice,Map 和 Channel 数据结构,这些类型 Go 中被称为引用类型。 new不同,make返回初始化(非零)值。... Go 语言中,扩容前后 slice 是不同,这体现在几个方面: 底层数组地址改变:当 slice 扩容(通常是由于 append 操作导致当前容量不足),会创建一个新底层数组并复制旧数组内容...因此,新 slice 底层数组通常不同,它们占用不同内存地址。 容量变化:扩容后 slice 有一个更大容量,这是为了容纳更多元素。...Pointers:指针传递复制是内存地址,因此即使是按值传递,调用方法和被调用方法依然可以访问到同一个变量。

    24410

    C语言中指针详解

    “初始地址值” 通常是 “&变量名” “&数组元素” 或 “一维数组名”,这里变量或数组必须是已定义; 5. 定义指针变量,可以只给部分指针变量赋初值; 6....指针变量1- 指针变量2; 由于指针运算符*自增运算符++、自减运算符--优先级相同,结合方向都是从右至左,因此需要注意以下各种形式含义不同。 6....用下标存取字符串中字符 字符指针和字符数组区别: 1. 存储内容不同; 2. 赋值方式不同; 3. 字符指针变量定义后应先赋值才能引用; 4....若被调函数中有对形参所指变量内存改变,实际上是改变了实参所指变量内容。 数组名作为函数形参接收实参数组地址数组名作为函数实参,将数组地址传递给形参数组。...指针型函数是指函数返回值是指针型,即这类函数返回值必须是地址值,调用该类函数接收返回值必须是指针变量、指针数组元素等能够存放地址对象。

    2.4K20
    领券