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

目录

前言

一、数组名的理解

二、使用指针访问数组

三、一维数组传参的本质

四、冒泡排序

五、二级指针

六、指针数组

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


前言

本篇主要讨论以下问题:

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

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

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

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

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

  6. 什么是二级指针

  7. 什么是指针数组

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

一、数组名的理解

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

  2. 两个例外情况:

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

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

二、使用指针访问数组

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

三、一维数组传参的本质

  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* arr10;、char* arr5;、char** arr8;

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

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

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

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

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

相关推荐
mqiqe7 小时前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
gugucoding7 小时前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
Nebula_g8 小时前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
for_ever_love__8 小时前
python基础语法学习: 异常的传递性
开发语言·python·学习
依然鸣9 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
byxdaz9 小时前
QT中服务使用
开发语言·qt
库玛西10 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
AC赳赳老秦10 小时前
风控岗应用:OpenClaw 采集公开司法与经营异常数据,自动生成企业风险评估报告
大数据·c语言·数据库·人工智能·python·php·openclaw
liulilittle11 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
朋克洛德的码农11 小时前
Go并发-sync包四剑客:Mutex、RWMutex、WaitGroup、Once-从入门到原理
开发语言·后端·golang