前言:
本人现阶段只是一个大二学生,写下这些文章的目的旨在于总结自己的知识,适合一些已有粗略基础的人提高自己。
如果有任何地方有误,请谅解并且我希望您能留言告知。谢谢!
当然,欢迎提问,朕知无不言,言无不尽。(滑稽)
数组的定义
数组由目标类型名、变量名、以及[]组成。
例:int nBuf[255];
注:[]中指定该数组可以“存放”多少目标类型元素。[]我们称之为“下标”(运算符),例如[10]代表下标为10;
描述程序猿定义的符号名(上述的“变量名”),C语言中用”变量“,C++中用“对象”。
但个人喜欢在将内置类型定义的符号名称为变量, 将类类型定义的符号名称为对象,但实际上变量和对象描述的都是同一个东西,只不过叫法不同。
数组的存在意义
数组常被用于存放数据。当你觉得需要在以后使用现在得到一堆数据,而现在又不需要时,可以用数组存储该数据集。
当需要使用的时,使用该数组中的数据即可。换句话说,和“缓冲”的概念有些相像。
数组是以前的程序员创造的,虽然如今有很多东西可以替代数组,但是内部或多或少都借用了数组的知识。
可以理解为数组是钢筋水泥,而队列、链表等容器都是高楼大厦。
PS:如果不知道缓冲、容器的定义,可以去了解一下,但不推荐新手深入。因为这是后期的知识。
数组的基础应用
int main()
{
//假设我们在定义该数组之前得到一串数字,180,100,18. 代表的是一个男人的身高、体重、和长度。
//那么我们现阶段可以定义一个数组用来存放这些.
int nBuf[3];
nBuf[0] = 180;
nBuf[1] = 100;
nBuf[2] = 18;
//后面我们会用到这些数据。
cout<<"The Person's height:"<<nBuf[0]<<endl;
cout<<"The Person's Weight:"<<nBuf[1]<<endl;
cout<<"The Person's Length:"<<nBuf[2]<<endl;
return 0;
}
也许有人好奇,为什么下标是从0开始,而不是1。哎╮(╯▽╰)╭,这说明你还是小新人啊。这些数组的基础知识呢,希望您能在其他地方看懂。
毕竟我这文章只是我自己的总结,不是教学。很多基础知识我只会尽可能提及,不会全面覆盖。
<( ̄3 ̄)> 为了不显得突兀,我就在前面讲了不少基础,算是个简单过度。总算是把一些基础讲完了,真累啊。接下来就是我自己的自由发挥时间了。接下来的东西就是我真正的总结了。
——真 · 数组总结——
数组的一般常识
数组名其实可以代表其首地址。
int nBuf[20] = {0};
//由于C++的cout把一些东西都封装起来了,不好讲。所以我用c的输出函数来讲解,更清楚
printf("%p\n", nBuf);
printf("%p\n", &nBuf);
结果:
可以看到,结果是一样的. 这代表了。数组名就字节代表了其首地址。至于为什么要讲这个,的确,乍一看好像没什么用,但是认真一想,你会发现,的确真的没什么用。W.W。好吧,其实是有用的,主要是为了和指针进行联动。 不过那也是后话了。 只需要知道数组有这个特性就行。
C风格的字符串是以‘\0’结尾的。
char str[] = "Are you gay?";
//那么问题来了,这个str有多少个字节呢?
cout<<sizeof(str)<<endl;
答案是:
细心的人可以发现,字符串”are you gay?“一共是12个字符,但是却占内存13个字节,那么由我上面所说,多出来的那个字节就是‘\0’了。为解除怀疑,咋们直接看内存。
(这里面其实还有个道道,就是00后面为什么会有3个字节的CC,哎,朕乏了,不想讲了。只说一句:32位机器cpu吞吐量是4个字节,所以内存的分配是以4个字节来算的。就算只需要一个字节,但是会给你分配4个字节,是为了”内存对齐“,具体可参考char类型变量的内存样式)
数组的占地内存
注:本人使用的是vc6.0,因为vc的环境感觉更容易用于学习。并且是32位机器。
也就是cpu吞吐量是(32/8b = 4B)4字节一次。
注2:至于内存是什么,长啥样,额,这个还真不好讲,大家懂的话就看,不懂,我也没办法。
注3:VC6.0中可以用快捷键alt+6导出内存框。
int main()
{
char SzBuf[20] = "Hello World!";
return 0;
}
我不会去使用sizeof来讲解内存大小,太没意思,直接进内存看不就得了。
内存中:
我们可以很清楚地看到,SzBuf的地址是0x0012ff6c。我们进入该内存地址可以看到红色的内存块。这个红色的内存块代表着SzBuf的所占地址空间。一共是4*5,也就是20个字节(毕竟我们在定义数组的时候就写明[20],也就是告诉编译器该数组占内存20个char类型大小的字节。char类型在32位机器是1个字节。)。而hello world!一共占了12个字节。多余的8个字节被编译器置为0;
若我们修改SzBuf的值又会怎样呢。
int main()
{
char SzBuf[20] = "Hello World!";
strcpy(SzBuf, "Test");
//strcpy是系统库函数,为了方便就直接用了。
//你可以把这句话理解为把"Test"字符串复制给SzBuf。主要是为看SzBuf的内存块是怎么变化的。
return 0;
}
–要不以后写一篇内存的文章吧。哎(╯﹏╰)–
内存中:
我们可以很清楚地看到,复制test进入SzBuf数组中,只是把前5个字符替换了。而后面的字符并没有管。
啊,我好累啊,我从没想过,原来写这些东西这么累啊,以后写的话还是不考虑新手看的问题。毕竟虽然是个很简单的东西,但是要和新手讲起来,真的要讲好多东西啊!!!,而且我这写的已经是非常的粗略了啊!!! o(≧口≦)o
数组的函数应用
在函数中,我们常见到形参表中出现( char str[] )。这里我得解释一波,str并不是数组,而是指针。它和 char *str没什么区别。至于为什么有人要这么写。咕~~(╯﹏╰)b,那谁知道呢,反正编译器翻译的时候,是直接把str当做指针来使用的。
————累了累了,其他的不讲了,以后闲的无聊再加吧。————