【C语言__指针02__复习篇12】

目录

前言

一、数组名的理解

二、使用指针访问数组

三、一维数组传参的本质

四、冒泡排序

五、二级指针

六、指针数组

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


前言

本篇主要讨论以下问题:

  1. 数组名通常表示什么,有哪两种例外情况,在例外情况中数组名表示什么

  2. 知道使用指针访问数组其实就是指针+-整数和指针解引用的应用

  3. 知道 arr[i] 本质是 *(arr+i),即数组首元素的地址偏移后进行解引用

  4. 一维数组传参的本质是什么,形参部分究竟有没有创建新的数组,数组的大小是否作为参数传递给被调函数以及为什么

  5. 冒泡排序的规则是怎样的,怎样写一个冒泡排序

  6. 什么是二级指针

  7. 什么是指针数组

  8. 怎样用指针数组模拟二维数组

一、数组名的理解

  1. 数组名通常表示数组首元素地址 (也可以理解为数组名是一个指针变量,里面存放着数组首元素的地址)。

  2. 两个例外情况:

①++sizeof(数组名)++:sizeof中单独放数组名,这里的数组名表示整个数组,sizeof计算的是整个数组的大小,单位是字节。

② ++&数组名++:这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址数值上一样,但本身是有区别的,&数组名的指针类型是什么呢,后面会讲)

二、使用指针访问数组

上图中,指针p就是arr,arr[i]表示的本质就是*(arr + i),由加法交换律可得arr[i] == i[arr]。

三、一维数组传参的本质

  1. 在数组传参的时候,传递的是数组名,也就是说++数组传参本质上传递的是数组⾸元素的地址++ ,也正是如此,++在被调函数内部是没办法求得数组的元素个数++的,因此在数组传参时通常会把数组的大小也一并传给被调函数。

  2. ++⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式++ ,但无论写成哪种形式,++形参部分表示的都是一个指针,而不是数组++ (形参部分并不会创建一个数组)。

四、冒泡排序

cpp 复制代码
#include <stdio.h>
//用冒泡排序把一个整型数组排为升序
//冒泡排序:让相邻的两个元素比较,如果不满足顺序就交换
//每趟冒泡排序可以搞定"最后一个位置"上放的元素,sz个元素sz-1趟就能搞定
//每搞定一趟,最高比较的下标要-1
void BubbleSorrt(int arr[], int sz)
{
	//趟数
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int flag = 1;//假设本趟本身就全为升序
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = 0;
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;//有交换,本趟一定不为全升序
			}
		}
		if (flag)
		{
			break;
		}
	}
}

void Print(int arr[], int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int main()
{
	int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };//降序
	int sz = sizeof(arr) / sizeof(arr[0]);
	BubbleSorrt(arr, sz);
	Print(arr, sz);
	return 0;
}

五、二级指针

  1. 二级指针是用来存放一级指针地址的指针变量。

  2. 对二级指针解引用就可以找到其所指向的一级指针,对一级指针解引用就可以找到其所指向的变量。

六、指针数组

1.存放指针的数组叫指针数组,指针数组的每个元素都是相同类型的指针变量。

例如,int* arr[10];、char* arr[5];、char** arr[8];

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

  1. arr是数组arr首元素的地址,让arr偏移并解引用就可以找到arr数组中的每个元素,而arr数组中的每个元素是其他数组首元素的地址,对该地址偏移并解引用就可以找到数组arr1、arr2、arr3中的每个元素。

  2. arr[0] == *(arr + 0) -->找到数组arr1首元素的地址,arr[0][0] == *(*(arr + 0) + 0),找到arr1中第一个元素。

arr[1] == *(arr + 1) -->找到数组arr2首元素的地址,arr[1][0] == *(*(arr + 1) + 0),找到arr2中第一个元素。

arr[2] == *(arr + 2) -->找到数组arr3首元素的地址,arr[2][0] == *(*(arr + 2) + 0),找到arr3中第一个元素。
本篇文章已完结,谢谢支持!!!

相关推荐
代码雕刻家26 分钟前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
吾爱星辰1 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
ChinaDragonDreamer1 小时前
Kotlin:2.0.20 的新特性
android·开发语言·kotlin
IT良1 小时前
c#增删改查 (数据操作的基础)
开发语言·c#
Kalika0-02 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
_.Switch2 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
代码雕刻家2 小时前
课设实验-数据结构-单链表-文教文化用品品牌
c语言·开发语言·数据结构
一个闪现必杀技2 小时前
Python入门--函数
开发语言·python·青少年编程·pycharm
Fan_web2 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
龙图:会赢的2 小时前
[C语言]--编译和链接
c语言·开发语言