一、数组名的理解

(1)一般情况

  • 数组名就是数组⾸元素(第⼀个元素)的地址。

(2)特殊情况(唯二)

  • sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的大⼩,单位是字节

  • &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)

(3)思考

【C语言/知识梳理/期末复习】指针(二)(附思维导图)-LMLPHP

(4)arr和&arr的区别

  • &arr[0]和&arr[0]+1相差4个字节,arr和arr+1 相差4个字节,是因为&arr[0] 和 arr 都是⾸元素的地址,+1就是跳过⼀个元素。
  • 但是&arr 和 &arr+1相差40个字节,这就是因为&arr是数组的地址,+1 操作是跳过整个数组的

二、使用指针访问数组

【C语言/知识梳理/期末复习】指针(二)(附思维导图)-LMLPHP

三、一维数组传参的本质
 

(1)本质

  • 数组传参本质上传递的是数组⾸元素的地址,所以函数形参的部分理论上应该使⽤指针变量来接收⾸元素的地址

(2)总结

  • ⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

  • sizeof(arr) 计算的是⼀个地址的⼤⼩(单位字节)⽽不是数组的⼤⼩(单位字节)。正是因为函数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。

【C语言/知识梳理/期末复习】指针(二)(附思维导图)-LMLPHP

四、冒泡排序

(1)核心思想

  • 相邻的两个元素比较,如果不满足顺序就交换

(2)代码呈现

#include<stdio.h>

void Bubble_sort(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		for (int j = 0; j < sz - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
int main()
{
	int arr[10] = { 2,4,5,8,1,3,7,9,0,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Bubble_sort(arr, sz);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

五、二级指针

(1)铺垫知识

  • int* p = &a(p是指针变量)

(2)二级指针

  • int * * pp= &p;,int*组合起来证明pp指向的对象(p)的类型是int*

六、指针数组

(1)概念:存放指针的数组

【C语言/知识梳理/期末复习】指针(二)(附思维导图)-LMLPHP

(2)

  • 指针数组的每个元素是地址,⼜可以指向⼀块区域

七、指针数组模拟二维数组

  • arr [ i ] === *(arr + i ) {计算机计算形式} arr[i][j] ===*(* (arr+i) +j)

【C语言/知识梳理/期末复习】指针(二)(附思维导图)-LMLPHP
【C语言/知识梳理/期末复习】指针(二)(附思维导图)-LMLPHP

  • parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数组中的元素。
  • 上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。
01-30 01:22