文章标题

来源:互联网 发布:数据分析python 编辑:程序博客网 时间:2024/05/29 11:50

学了这么久的C才发现有些东西没弄懂,后面很多东西都有问题,现把这些易混淆的知识点整理出来,帮助大家不要在犯错了。
写在最前面的话:本文只是提供一个思路,不要想着不敲代码就能真真理解里面的东西,实践才是关键
数组:静态性,越界以及溢出
① 静态性:数组一旦被定义后,占用的内存就是固定的,不能在任何位置插入元素,也不能在任意位置删除元素。
② 越界:当数组的下标小于0或大于等于数组长度时,就发生越界。C语言为了提高效率,并不会对越界行为进行检查,即使越界了,也能够正常编译,只有在运行期间才可能会发生问题。大家要提高警惕。
③ 溢出:当赋予数组的元素个数超过数组长度是,就发生溢出。
**VC/VS发现数组溢出会报错,禁止编译通过,而GCC不会,他只给出警告。
同时在C89中,必须使用常量指明数组的长度,不能使用变量
而在C99中,可以使用变量指明数组的长度。
在C-free 5.0,GCC下编译通过,而在VC6.0,VS2010下会报错。**
现在我们来谈谈一维数组:

  // a 与 &a 的区别#include<stdio.h>void main(){   int a[5]={1,2,3,4,5};   printf("a:%d, a+1:%d, &a:%d, &a+1:%d",a,a+a,&a,&a+1);   //虽然 a 和 &a的输出结果一样,但是 a 和 &a 所代表的数据类型不一样   // a 代表的是数据首元素的地址,但他不能代表整个数组,只能代表起始个体的地址   //  &a 代表的是整个数组的地址,,他的加1是以整数数组所占字节数总数为单位}

接着来谈谈二维数组

首先二维数组为什么要按 行访问 来读写数据:
按行访问的效率高,因为 内存存储是按照页来存的。这样存储,移动指令,移动的范围小,不用跨页操作,不会发生页面的交换。(跟内存的存储方式有关)

{      int a[2][2]={1,2,3,4};//这是一个2*2的二维数组      int (*p)[2];//数组指针      p=a;//令p指向数组a  }

①a是一个数组名,类型是指向一维数组的指针,不是变量,而是指针常量。即不能有a++或者a=p这些操作。a指向这块连续空间的首地址,值是&a[0][0]
②a[0]是一维数组名,类型是指向整型的指针。值是&a[0][0],这个值是一个常量
a[1]是一维数组名,类型是指向整型的指针,值是&a[1][0]。也是一个常量

③p是一个数组指针变量,指向一维数组的指针变量。可以执行p++;
a+1表示指向下一行元素,可以理解为指向下一个一维数组。
a[0]+1是指向第0行第一个元素
p+1和a+1相同
各种sizeof:
Sizeof(a)=16; sizeof(p)=4
sizeof(a+1)=4 //此时做了+运算,转换成了指针变量
sizeof(p+1)=4

后面补充字符串和字符数组

原创粉丝点击