整理今天的学习内容
1.数组名的理解
数组名就是数组首元素的地址
但有两个例外:
sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
&数组名,这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的,原因是变量类型不同,指针移动的单位大小不同)
整个数组的地址+1跳过10*4个字节
2.使用指针访问数组
由于,arr和p在这里是等价的,所以p[i]也可以访问数组,同理arr[i]=*(arr+i)==i[arr]
,数组元素的访问在编译器处理的时候,也是转换成首元素的地址+偏移量求出元素的地址,然后解引用来访问的
3.一维数组传参的本质
把数组传递给函数,在函数内部求数组元素的个数
错误示范:
可见在函数内部没有正确或的元素的个数
原因:本质上数组传参传递的是数组首元素的地址,sizeof(arr) 计算的是⼀个地址的大小(单位字节)而不是数组的大小(单位字节)
⼀维数组传参,形参的部分可以写成数组的形式(便于理解),也可以写成指针的形式
4.冒泡排序
冒泡排序的核心思想是:两两相邻的元素进行比较
将一组数据按照升序的方式排列
上述代码效率不够高,无论什么数列都需要排查1+2+3+4+5+6+7+8+9=45次
优化:
5.二级指针
指针变量的地址存放在二级指针中
关于二级指针的运算:
*ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa
**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引⽤操作: *pa ,那找到的是 a
6.指针数组
(1)指针数组是存放指针的数组,每一个元素都是指针
(2)指针数组模拟二维数组
arr4[i]访问的是arr4数组的元素,arr4[i]找到的数组元素指向了整型一维数组,arr4[i][j]就是整型一维数组中的元素
上述代码模拟出了二维数组的效果,实际上并非完全是二维数组,因为每一行并非是连续的
7.字符指针变量
字符指针变量有两种使用方式:
第二种本质上是把首字符的地址存放到了字符指针变量中
有一道和字符串相关的笔试题:
问程序输出结果
这里str3和str4指向的是同⼀个常量字符串,C/C++会把常量字符串存储到单独的⼀个内存区域(常量字符串不会修改,所以内存不会存两份),当几个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同
8.数组指针变量
数组指针变量是能够存放数组的地址,指向数组的指针变量
表示方式:int (*p)[10];
p先和*结合,说明p是一个指针变量,然后指针指向的是一个大小为10个整型的数组,所以p是一个指针,指向一个数组,叫数组指针
注意:[]的优先级要⾼于*号的,所以必须加上()来保证p先和*结合