深入理解指针,数组的基本概念

来源:互联网 发布:燕十八php 编辑:程序博客网 时间:2024/05/21 04:43

指针

首先说一下指针指向的空间和对应的空间
这里写图片描述
p对应的空间就是它自己的的空间(即0x2000的空间)
指向的空间就是num的空间(即0x1000的空间)

num++:就是对应的空间里面的值+1;
p++:就是p对应空间里的值+1(注:这个+1,指的是加一个步长)(步长:就是一个模块,比如此时是int,4个字节,所以步长就是4,再比如,如果char型的步长1,接下来还会讲到)

野指针

野指针就是,指针随机地指向一块内存
它导致内存泄漏
原因:访问的内存已经释放。访问没有访问权限的内存
如何避免:
首先要有良好的编码习惯,定义一个指针时,若指针没有指向,请指向空
当要往指针指向的空间赋值时,检查是否分配一个合法空间。

指针赋值

指针必须是相同指针类型赋值,不同指针类型赋值会导致越界或取址不完整(注:因为指针的步长不一样,比如int *p和char *ptr对吧,p++和ptr++步长比一样,p加一次4个字节,而ptr加一次1个字节,如果之间赋值的话,就会导致上述后果)

指针 - 指针 = 两个地址之间有的数据的个数
总结:指针变量说白了就是变量,他满足变量的操作,它的特殊在于,它保存的是其他数值的地址。“ * ”间接取址,就是根据指针变量里面的地址寻找到地址的空间里的值。

数组

int a[3];
a是首元素的地址
&a是数组的地址
这里写图片描述

&a: 对一维数组的数组名取地址等于数组的地址
*(&a) = a:对一维数组的地址取值等于数组首元素的地址

数组指针变量

int (*pa)[MAX_SIZE] = &a
他是指针里面保存数组的地址(即指向数组)

二维数组

int a[ 2 ] [2 ] ;
这里写图片描述

二维数组的数组名a:指的是首个一维数组的地址
(三维数组的数组名就是首个二维数组的地址)
a + i : 第i+1个一维数组的地址
*(a+i):第i+1个一维数组的首个元素的地址
*(a+i)+j:第i+1个一维数组的第j+1元素的地址

再看一下三维数组的意思
* (* (*(a+i)+j)+k)
a+i:第i+1个二维数组的地址
*(a+i):第i+1个二维数组的首个一维数组的地址
*(a+i)+j:第i+1个二维数组的第j+1一维数组的地址
。。。。。。。。。。

有关数组传参的问题

数组传参重点是要看传过来的参数名代表什么。
比如:int a[3]; print(a);(调用print函数),此时分析a到底代表什么:a:代表首元素的地址,所以函数接用元素的指针即:void print(int *a),在比如:int src[2][ 2 ];print(src);函数接的时候 就要考虑src代表什么,通过上面的讲述知道二维数组的数组名src代表首个一维数组的地址,我们就要用指向一维数组的指针来接即void print(int *src[2]);
再比如int *pa[3 ] ( 指针数组 ),我们pa就是一维数组,里面的元素是指针,所以,pa指的是首元素的地址,函数借用指向首元素的指针,即用指针的指针来接

上述是个人理解,如有不对,谢谢指出!

0 0
原创粉丝点击