您的位置:首页 > 其它

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

2016-07-18 20:13 302 查看

指针

首先说一下指针指向的空间和对应的空间



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指的是首元素的地址,函数借用指向首元素的指针,即用指针的指针来接

上述是个人理解,如有不对,谢谢指出!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针 数组