0718学习记录(指针与数组)

来源:互联网 发布:数控折弯机怎样编程 编辑:程序博客网 时间:2024/06/16 22:21

今天学习的内容比较多,到现在也还是没彻底弄懂,只能一边回忆一边编写,希望在以后的学习生活中能慢慢理解。
让我们先来看一下野指针的相关知识。首先,野指针是难以杜绝但是是可以避免的,它的定义是随机指向内存的一块地址,导致内存泄露,那么它产生的原因有两个原因:1.指向一块已经释放的内存 2.指向一块无法访问的内存。前者很好理解,我们在之前的操作给指针分配了地址,用完之后将其释放,之后的操作又用了一个指向该地址的指针,后者,无法访问指的是指针操作超出了变量作用域。那么我们该如何减少野指针的出现呢,最重要的还是我们需要有良好的编码规范,我们在使用指针的时候需要注意以下五点。1.是否初始化了这个指针,例如char *p=NULL;2.是否给这个指针分配了空间3.检查分配空间,看看分配是否成功 4.用完了这个指针分配的空间,我们需要释放掉。free(p) 5.我们要再次将这个指针指向空 p==NULL;至于为什么要置为0,一个方面是零地址是不允许访问,不允许操作的,第二点,NULL在编程过程中字体的颜色是显眼的,它能提醒你是否注意到了初始化以及置空。
接下来让我们看看数组的内容,先从简单的一维数组讲起,我们知道,数组名是首元素的地址,例如定义一个整形数组:int a[10],a便是a[0]的地址,a++便是之后a[1]的地址,依次类推。元素是有地址的,同时这个整个的一维数组也有它自己的地址,它的地址是什么呢?是&a,即对一维数组的数组名取地址等于数组的地址。反过来怎么说?*(&a)=a,对一维数组的地址取值等于数组首元素的地址,同时,数组的地址与数组首元素的地址在内存中是一样的,即&a=a,但是它们的步长是不一样的,a++步长是一个int类型的字节,是4,而&a++,则是一个数组的步长,是10 *4=40 个字节。一维数组的传参我们用数组的元素名。
二维数组,假设是int a[2][2]={1,2,3,4};二维数组的元素名是首个一维数组的地址,那也就是a[0][]的地址,即a=&a[0],假设我们用i代表行,用j代表列,那a+i则是第(i+1)个一维数组的地址,(a+i)则是第i+1个一维数组的首元素的地址, (a+i)+j就是第i+1个一维数组的第j+1个元素的地址,那么 (a+i)+j)则是第i+1个一维数组第j+1个元素的值。经过推理我们可以得出 (&a)=a,即对二维数组地址取值等于首个一维数组的地址,同时,整个二维数组的地址等于它其中首个一维数组的地址,也等于它首个一维数组中首个元素的地址,即 (&a)=a,二维数组的传参用一维数组指针
三维数组就依次类推,什么数组名是首个二维数组的地址等等……不再一一叙述。
我们最后来看数组指针和指针数组,数组指针,是一个指针变量,它里面保存的是一个数组的地址,如 char * a[ 10];指针数组则是一个数组,里面放的全是指针,如char (*src)[10]。这其中的奥秘等讲到函数的时候再继续探寻。

0 0
原创粉丝点击