最近赶进度没有时间写帖子,今天终于抽出时间来写这个帖子,这也是我欠大家的。
对于对于单单的数组 和 单单的指针相信大家应该都不会晕,但是两者结合起来就会让一大批刚刚学习的人蒙圈掉,归根结底就是有一些东西模糊不清,有很多写法到底有什么区别,下面我简简单单的谈一下我的理解:
1、数组
大家应该应该都不陌生,数组在内存中的表现就是一块连续的内存,每个元素存储的都是一样的数据类型,无论是基本的数据类型还是自定义的结构体类型。但是特点就是存储相同的结构。基本概念我在这里就不赘述了,相信大家都已经烂熟于心了。我主要说的就是大家比较迷惑的地方:
数组的名字,大家都知道是数组的第一个元素的地址,也称数组的首地址,根据这句话我们就可以得出结论:
int array[5];
他的array 和 &array[0] 是完全等价的。都是表示的数组的首地址。
数组元素的访问我们都是通过数组的下标进行访问的,那么我们就需要深入的去理解一下程序运行的时候,是怎么通过下标进行数组的访问的:
访问操作的就是在数组首地址array的地址向后移动 所存储数据类型 乘以 元素的个数。
以上面的例子举例:比如我们通过array[3]来取数组array的第四个元素,其实在内存中的操作就是在数组的首地址array的基础上向后移动数组所存元素所占字节(例子中是int这里是4)个字节 乘上 所取的个数(这里就是3),也就是在array的基础上向后移动4 * 3 = 12个字节,然后再取出后面4个字节的内容就是array[4]了。
从上面的理解了之后,就可以得出如下结论:
array[3] 和 *(array + 3) 和 [3]array 都是一个意思,也都是合法的,都是取出数组array的第四个元素。
我感觉上面的讲解,如果大家都明白了的话,应该就能解决单独的数组方面的问题了。如果没明白或者还有其他问题的话可以留言,我会为大家解答。
2、指针
指针就是一个内存地址,更多的理解可以理解成某个变量的地址。我们使用指针,就是来做内存的访问,二维数组这个帖子中我不进行讲解,如果需要我单开一个帖子,这里我主要讲讲指针和数组结合起来的使用。其实上面的话,根据我的理解就在看这里就很容易理解了:
int array[5];
int *arrayPtr = array;//arrayPtr = &array[0]是一样的
这里面用arrayPtr指向了数组的首地址,这样我们就可以用指针来进行数组的访问,如果只是进行数组的访问,其实和使用数组名是一样的(数组名就是指针):
比如我们还是取第4个元素,下面几种写法都是一样的:
arrayPtr[3];
*(arrayPtr + 3);
3[arrayPtr];
就因为数组名就是数组的首地址,所以使用指针和使用数组名字来取某个元素其实是一样的。但是也是有区别的:
数组名array是一个常亮,这个array是不能改变的,比如array ++;array += 1;array = array + 5等一切数组名在赋值运算符左边的操作都是不合法的,编译器是不会通过的。
相反指针arrayPtr是一个变量,他是可以放在赋值运算符的左边的,比如进行arrayPtr++; arrayPtr +=3等等都是完全合理的。
其实我要说的到这里就都差不多了,相信这个帖子能消除大部分的心理模糊心理啦,遇到这种问题就是需要多联系就知道啦,如果有什么问题欢迎大家多多的指正,大家相互交流,才能前进的更快。
|
|