数据结构与算法 c语言,数组是一种数据结构吗为什么,数据结构与算法 c语言,数组是一种数据结构吗对吗
【C语言数据结构】:数组本质上只是编译器在内存空间切割出来的【一系列内存】。
数组的[变量]其实就是这一系列内存空间的[第一个元素的内存地址]。
所以rxdyb在给编译器展示数组的时候,并没有像人一样看到数组的全貌。他只看到数组的第一个元素,并且知道它的内存地址。
【蒙着眼睛看这句话?没什么大问题!那就看看吧]
一、定义数组一般数组的定义很简单。仅此而已。
int numList[10];您可以定义一个具有10个空间大小的整数数组,其中可以存储10个整数元素。
当定义未初始化时,就可以理解为什么没有了,是空的。拿着包,好像里面什么都没有。
1.【知识拓展】对数组的理解。毕竟数组也是你学C语言的时候学的,所以我们再学数据结构的时候一定要深入。
当然,上面的例子不是很恰当。也许这个例子更好:
你们学校开会,【第一排座位】规定只能给【指导老师】坐。
这个【第一排座位】可以理解为这个【排列】。【10座】的按【长度10】排列,【领袖】就是这个【int类型】。
如果这还不能理解…那…看视频就明白了【手动狗头】
2.【知识扩展】数组的初始元素当然可以理解为空。
然而,它不是空的。它由数组长度的空闲内存地址组成(上面的数组是10)。好吧,请不要相信。打印我是真是假。
# include stdio . hint main((inta[10];for(intI=0;i10I ) {printf(%d\n ,a[I]);}看到这里,有些Java玩家可能会受不了。明明没有定义,你却打印出来报错!
通过:Java需要定义和声明
但是可以吗?显然不是。有些元素
打印结果:
199781873401447673468642376420000594199952044 Ni,序列类型强制为——带着问题学知识——。
如何得到目标值?为什么下标从0开始?为什么数组强制类型?————————————
[p1]如何获得目标值?我们知道数组实际上是在内存空间中打开的一个连续的内存地址,编译器只有数组第一个元素的内存地址。
[下标]实际上是操作数组中第一个元素的内存地址。添加[下标]得到[which]元素。
假设第一个数组元素的内存地址是00000001,数组变量是[a](数组是整数),[a[0]]实际上是把内存地址[0]作为第一个元素的内存地址。
另一方面,这个数组是一个整数数组,整数类型在内存中占用4个字节,所以需要表示为第二个元素获取第二个元素的内存地址,获取第二个元素。
数组显示的地址与数组第一个元素的地址相同。
# includesdio . hint main(int argc,char const *argv[] () inta )={ 1,2,3,4 };//a数组printf(内存地址a(内存地址p(na )0) p),a,a)0);0;}执行结果:
A的内存地址0061FEC0a[0] p2]的下标为什么从0开始?看了上面的问题,你一定也意识到了这个问题。
数组内存实际上是第一个元素的内存,下标计算需要加上内存地址,所以必须从0开始。
[p3]为什么数组需要强制?看看刚才的公式。从[A [1]=] (000001) 1 * 4)转换为以下公式:
数组第一个元素的内存地址(内存中下标* type消耗的字节数)))))))))))))))))))。
所以数组强制类型。
在C语言中,这个内存地址可以通过[]直接获得。如果你有兴趣,你可以用这个符号来操作数组。
例如:
# include stdio . hint main((inta[10];for(intI=0;i10I () printf(%p(n),)a[I]);}打印并自己检查数组的内存地址,判断是否相邻,是否相邻4
执行结果:
01 FEA 4061 FEA 80061 feac 0061 feb 0061 feb 40061 feb 80061 feb 061 feb 061 FEC 0061 FEC 0061 FEC 0061 FEC 40061 FEC 8 III。使用加法和变更检查数组的操作。
其实增加的也是未初始化的时候,而不是长度的增加。
使用数组时,永远不要记住数组的长度。不要超过数组的长度,否则会出现错误。
1.添加遍历赋值的操作
# include stdio . hint main(){ int a[10];for(int I=0;i10I){ a[I]=I;Printf(元素的内存地址:% p \ n \元素的值:%d\n ,(a[i]),a[I]);}}运行结果:将0-9的值放入数组。
元素的内存地址:0061 FEA 4:0:0061 FEA 8:1:0061 feac:2:0061 feb 0:3:0061 feb 4:4:0061 feb 8:5值:6元素内存地址:0061 fc 0-元素值:7元素内存地址:0061 FEC 4-元素值:8元素内存地址:0061 FEC 8-元素值:9 2。变化是因为在定义时,数组不是空的,而且还有元素。当我们执行操作时,我们将替换原始值。这个变化是一样的原理。
3.通过下标查找元素。
# include stdio . hint main(){ int a[10];for(int I=0;i10I){ a[I]=I;Printf(元素的内存地址:% p \ n元素的值:%d\n\n ,(a[i]),a[I]);}}再来说说其他和数组相关的算法,比如二进制枚举,双指针,三进制枚举……
四、练习编程,最忌讳的就是只看不练,动一动做做一些题。
P1阵列串联给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans ,数组下标 从 0 开始计数 ,对于所有 0 = i n 的 i ,满足下述所有要求:
ans[i] == nums[i]ans[i + n] == nums[i]具体而言,ans 由两个 nums 数组 串联 形成。
返回数组 ans 。
资料来源:LeetCode
链接:https://leetcode-cn.com/problems/concatenation-of-array
版权归领网所有。商业转载请联系官方授权,非商业转载请注明出处。
P2基于排列构建数组给你一个 从 0 开始的排列 nums(下标也从 0 开始)。请你构建一个 同样长度 的数组 ans ,其中,对于每个 i(0 = i nums.length),都满足 ans[i] = nums[nums[i]] 。返回构建好的数组 ans 。
从 0 开始的排列 nums 是一个由 0 到 nums.length - 1(0 和 nums.length - 1 也包含在内)的不同整数组成的数组。
资料来源:LeetCode
链接:https://leetcode-cn.com/problems/build-array-from-permutation
版权归领网所有。商业转载请联系官方授权,非商业转载请注明出处。
操作后的P3变量值存在一种仅支持 4 种操作和 1 个变量 X 的编程语言:
++X 和 X++ 使变量 X 的值 加 1X 和 X-- 使变量 X 的值 减 1最初,X 的值是 0
给你一个字符串数组 operations ,这是由操作组成的一个列表,返回执行所有操作后, X 的 最终值 。
资料来源:LeetCode
链接:3359 leet code-cn . com/problems/final-value-of-variable-after-performing-operations
版权归领网所有。商业转载请联系官方授权,非商业转载请注明出处。
关注下方微信官方账号,获取更多福利-python基础教程-python知识脑图-Python入门100例-C语言数据结构教程-C语言算法100问
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。