1.数组名的理解
一般情况下,数组名就是首元素的地址,但是有两个特殊情况。
- sizeof(数组名),sizeof中单独放数组名,这里的数组表示整个数组,计算的是整个数组的大小
- &数组名,这里的数组表示整个数组,取出的是整个数组的地址。(整个数组的地址和首元素的地址是有区别的)
接下来,我们谈arr和&arr的区别
因为&arr[0]和arr都表示首元素的地址,所以他们+1是跳过4个字节
而&arr是表示整个数组的地址,所以他+1是挑个整个数组的字节即40个
2.使用指针访问数组
arr[i]表示以arr为起始地址去访问下表为i的元素
arr[i]==*(arr+i),但是真正访问的时候仍然是找到位置的偏移,然后再解引用。
同时,*(i+arr)==i[arr]因为加法支持交换律
小结:i[arr]==*(i+arr)==*(arr+i)==arr[i]
3.一维数组传参的本质
也就是说,数组传参的时候,传递的并非是整个数组,而是数组首元素的地址
所以再求一个数组的元素个数是,要在他没传参之前的主函数求得。
4.冒泡排序
·优化后的冒泡排序
5.二级指针
二级指针是用来存放一级指针的地址的
对于二级指针的运算有:
- *ppa通过对ppa中的地址解引用,这样找到的是pa,
int b=20;
*ppa=&b;//即pa=&b
- **ppa得到的是a
**ppa=30; //等价于*pa=30; //等价于a=30;
6.指针数组
进行类比:整形数组int arr[9],是存放整形的数组;字符数组char ch[5],用来存放字符的数组;
SO,指针数组是用来存放指针的数组
指针数组的每个元素都是用来存放地址的
指针数组的每个元素都是地址,同时又可以指向一块区域
7.指针数组模拟二维数组
(模拟出二维数组的结果,但并不是二位数组本身,因为他不是连续的)
parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j]就是一位数组中的元素。