采用指针分配的二维数组与直接定义的二维数组,sizeof的不同
采用指针分配的二维数组:
它的遍历方式是:
上面这个是分配二级指针的地址,二级指针就是一片可以用来分配一级指针空间的地址,然后指针寻址本来就可以当成数组进行处理
这个是对triangle分配了一个一级指针的地址,而一级指针就是一个一维数组,是来存放具体相应数据类型的东西,比如int类型,比如double类型等等
因此这里采用指针的方式来做一个二维数组,我们需要先定义一个二级指针,然后再来定义一级指针,另外需要需要注意的地方就是,二级指针必须分配相应的内存空间,也就是malloc出来相应的类型空间。
这片空间分配多大没有关系,只要是一个二级指针,后面就可以来分配一级指针的空间。
重点:
1. 用指针做的二维数组来讲,它的sizeof是一个指针大小,一般来讲是8个字节
2.而用传统方式来做一个二维数组,sizeof出来是整个数组的字节大小,如果sizeof出来的是一个列数组,那么就是整列的字节大小
下面是针对某些情况的特例分析:
1.一个一级指针要当成数组处理,比如说赋值啥的,就必须给这个一级指针malloc相应大小的内存空间
说一些可能会造成错误的情况:
1.当一级指针当成数组处理,你没有分配足够的空间或者没有对这个变量进行初始化的时候,都有可能会分配成功或者赋值成功,但是它会造成一些潜在的问题,所以这里强烈建议就是:如果我们要用一级指针来当成数组赋值,必须给这个一级指针分配到足够大的空间。同样这个对于二级指针赋值同样适用
遍历方式
目前来讲没有更加灵活的遍历方式,采用下面的方式进行遍历
这种方式是打印相对规则的二维数组有效,不规则的二维数组采用for循环的还是打印不出来的。
因为sizeof算不出来行数也算不出来列数,它能sizeof出来的就只有指针的大小,一般指针就是8个字节,你malloc这片空间不管多大都是8个字节的大小。
上面只是我们定义二维数组的一个特例,一般来讲定义一个二维数组要符合规范,每一行要有相同的数据分布
比如这样像如下这样定义
当我们需要存储很多字符串的时候,优先考虑采用什么样的方式存储
采用二级指针的方式存储还是采用二维数组的方式存储
strcpy与直接赋值字符串的使用场景
一般数组只能在初始化的时候进行字符串的赋值 ,下面这种场景都是会报错的
上面基本上都会提示赋值不兼容
根本原因就是:
不能改变数组指向的内存位置,还有一点需要注意的是也不能使用赋值运算符为整个数组重新分配新的值
正确的初始化字符串的方法是:
他们的赋值原理是:
他们并不是改变了数组的内存指向,而是把常量区的字符串内容给赋值过来放到数组指向的空间里面。“这样的定义的字符串内容是放到常量区的不会不知道吧”,而这种字符串赋值操作只会是存在第一次初始化数组的时候
那么这个时候问题来了,没有在第一次初始化的时候赋值字符串,那么又该如何操作呢?
这个时候strcpy就上场了,它的核心就是把常量区的字符串内容赋值到数值里面。
所以,如果没有第一次初始化字符串给数组,我们可以操作
注意引入头文件<string.h>,因为strcpy是包含在里面的。
所以当我们需要存储很多字符串在一个盒子里面的时候,我们可以采用字符数组形式存放。
但是我们必须区分另外一种情况,就是下面这种情况的赋值原理
上面说到用字符串初始化一个数组的时候,会把常量区的内容给拷贝过去,那么这个的赋值原理一样吗?答案是:不一样
这个的赋值原理是直接指向了常量区的空间,然后我们可以把指针当成数组处理,然后进行赋值与查找值
两者对比
利用指针来存放其实没有太多的空间限制,你可以存一个很大的字符串,它在大多数的时候都是不会出错的。
但是采用二维数组来存放,就会有严格的数组空间限制,你超出了一个数组字符串的存放空间,就会出现乱码,比如下面
只能存五个当时你超了。
所以综合分析一下就是:在你对数据长度没有严格要求的时候,我们可以采用字符指针来存数据。但是如果你对数据长度有严格要求的情况下,我们就用二维数组来存放字符串。
好了,祝大家早安午安晚安。