C语言进阶版第8课—指针(2)

文章目录

  • 1. 数组名的理解
  • 2. 指针访问数组
  • 3. 一维数组传参本质
  • 4. 冒泡排序
  • 5. 二级指针
  • 6. 指针数组
  • 7. 指针数组模拟二维数组

1. 数组名的理解

  • sizeof(数组名)— 这里的数组名代表整个数组,计算的也是整个数组的大小
  • &数组名 — 这里的数组名代表是整个数组,取出的是整个数组的地址
  • 除了以上两种,其他任何地方使用数组名,数组名都表示首元素的地址
//数组名的理解
#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf(" arr = %p\n", arr);        // arr  ---> 数组首元素地址printf("arr[0]=%p\n", &arr[0]);   //&arr[0]---> 数组首元素地址printf(" &arr =%p\n", &arr);     //  &arr  ---> 整个数组的地址,不过指向的是数组首元素地址printf("--------------------------\n");printf(" arr+1 =  %p\n", arr+1);printf("&arr[0]+1=%p\n", &arr[0]+1);printf(" &arr+1 = %p\n", &arr+1);return 0;
}

  arr&arr[0]都是指向数组首元素地址,两者等价,只是不同的写法,而&arr虽然也指向数组首元素地址,但它代表的是整个数组的地址,因此&arr+1代表跳过整个数组的地址,&arr&arr+1应该相差4*10个字节
在这里插入图片描述
在这里插入图片描述

2. 指针访问数组

在这里插入图片描述
在这里插入图片描述

3. 一维数组传参本质

在这里插入图片描述
在这里插入图片描述
  数组传参本质上传递的是数组首元素地址,另外一维数组传参时,形参部分可写成数组形式,大小可忽略不写,也可写成指针形式

#include <stdio.h>
void test(int arr[])      //也可写成void test(int* p)
{printf("hehe\n");
}int main()
{int arr[10] = { 0 };test(arr);return 0;
}

4. 冒泡排序

  • 问题描述:给一组整型数组,对其排序
  • 核心思想:两两相邻元素进行比较

在这里插入图片描述  冒泡排序就是第一个元素与其他九个元素对比,并按照升序或降序的方式进行相应的交换,每趟都能确定待排序的一个元素

//冒泡排序(简易版)
#include <stdio.h>
void bubble_simple(int arr[], int sz)
{for (int i = 1; i < sz; i++){for (int j = 0; j < sz - i; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}printf("第%d趟排序中第%d次对比/交换:", i,j+1);for (int n = 0; n < sz - i; n++){printf("%d ", arr[n]);}printf("\n");}printf("------------------------------------------\n");printf("第%d趟排序的结果:",i);for (int k = 0; k < sz; k++){printf("%d ", arr[k]);}printf("\n");printf("------------------------------------------\n");}
}
int main()
{int arr[10] = { 9,4,5,7,2,1,3,8,6,10 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_simple(arr, sz);return 0;
}

在这里插入图片描述
在这里插入图片描述

  • 冒泡排序优化代码
  • 有序则跳出
//冒泡排序(优化)
#include <stdio.h>
void bubble_sort(int arr[], int sz)
{for (int i = 1; i < sz; i++){int flag = 1;    //flag用来判断数组是否有序(1代表有序)for (int j = 0; j < sz - i; j++){if (arr[j] > arr[j + 1]){flag = 0;  //发生交换代表无序int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}if (flag == 1)break;         //如果这趟已经有序则跳出循环printf("------------------------------------------\n");printf("第%d趟排序的结果:", i);for (int k = 0; k < sz; k++){printf("%d ", arr[k]);}printf("\n");printf("------------------------------------------\n");}
}
int main()
{int arr[10] = { 9,4,5,7,2,1,3,8,6,10 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);printf("最终的排序结果>:");for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

在这里插入图片描述

5. 二级指针

  • 二级指针用来存储一级指针变量的地址

在这里插入图片描述

//二级指针
#include <stdio.h>
int main()
{int a = 10;printf("a的地址>:%p\n", &a);int* p = &a;printf("a的地址>:%p\n", p);   //p = &aprintf("p的地址>:%p\n", &p);  printf("*p = %d\n", *p);      //*p = aint* * pp = &p;**pp = 20;printf("p的地址>:%p\n", pp); //pp = &pprintf("pp的地址>:%p\n", &pp);printf("* *pp = %d\n", **pp); // *pp = p, **pp == *(*pp) == *p == areturn 0;
}

在这里插入图片描述
在这里插入图片描述

6. 指针数组

  • 存放指针的数组

在这里插入图片描述

7. 指针数组模拟二维数组

  • 在讲解之前,我们先来回忆一下二维数组

在这里插入图片描述
在这里插入图片描述
  arr与&arr[0]都是二维数组首元素地址,则arr+1和&arr[0]+1都是二维数组的第二个元素,跳过4*4=16个字节,图中arr和&arr[0]对应地址后两位B4==11*16+4*1=180,arr+1和&arr[0]+1则对应C4==12*16+4*1=196,两者刚好差16字节

  • 指针数组模拟二维数组
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/53405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 ELK Stack 进行云原生日志记录和监控:AWS 中的开发运营方法

使用 ELK Stack 进行云原生日志记录和监控 欢迎来到雲闪世界。在当今的云原生世界中&#xff0c;日志记录和监控是强大的 DevOps 策略的重要组成部分。监控应用程序性能、跟踪错误和分析日志对于确保无缝操作和主动识别潜在问题至关重要。在本文中&#xff0c;我们将指导您使用…

Vue——Diff算法

目录 什么是Diff算法&#xff1f; 比较方式 1. 同层比较 2. 双端比较 双端比较的步骤&#xff1a; 3. 通过 key 来优化比较 原理分析 1. 虚拟 DOM 和真实 DOM 2. Diff 算法的基本原理 3. 双端比较优化 4. 通过 key 进行优化 5. 具体操作 6. 原理总结 声明&#xf…

AWS SES服务 Golang接入教程(排坑版)

因为刚来看的时候 也迷迷糊糊的 所以 先讲概念 再上代码 一 基础设置 这里需要完成两个最基础的设置任务 1 是验证至少一个收件电子邮箱 2 【很关键】是验证发送域。即身份里的域类型的身份。&#xff08;可以理解为配置你的域名邮箱服务器&#xff08;SMPT&#xff09;为亚马…

Flink问题记录

尚硅谷Flink1.17问题记录 上手pom依赖循环递归WordCountStreamDemo中readTextFile是deprecated&#xff08;强烈反对的&#xff09;Flink本地模式开启WebUI 上手 pom依赖循环递归 pom依赖中&#xff1a; <dependency><groupId>org.apache.flink</groupId>&…

使用C++20协程实现异步I/O操作:实战指南

使用C20协程实现异步I/O操作&#xff1a;实战指南 随着C20的发布&#xff0c;协程&#xff08;coroutines&#xff09;作为一种新的语言特性被引入&#xff0c;为异步编程提供了强大的支持。协程使得编写异步代码变得更加简洁和直观&#xff0c;避免了传统回调和状态机的复杂性…

Spring MVC: 构建Web应用的强大框架

Spring MVC: 构建现代Web应用的强大框架 1. MVC设计模式简介 MVC (Model-View-Controller) 是一种广泛使用的软件设计模式,它将应用程序的逻辑分为三个相互关联的组件: Model (模型): 负责管理数据、业务逻辑和规则。View (视图): 负责用户界面的展示,将数据呈现给用户。Con…

关于Qt在子线程中使用通讯时发生无法接收数据的情况

在多线程应用中&#xff0c;串口通讯或TCP通讯的场景常常涉及到持续的读写操作&#xff0c;如果子线程处理不当&#xff0c;可能会导致信号阻塞问题。本文将通过串口通讯或TCP通讯为例&#xff0c;详细解释如何在多线程环境中避免信号阻塞&#xff0c;并提供代码示例。 1. 问题…

前端开发中遇到的小问题以及解决方案记录2

1、H5中适配屏幕的工具-postcss-px-to-viewport postcss-px-to-viewport。因为设计稿一般给的都是375px宽度的&#xff0c;所以假如一个字体是16px&#xff0c;那么在开发中不能直接写死为16px&#xff0c;因为各个厂商的手机屏幕大小是不同的&#xff0c;所以要根据屏幕大小去…

【人工智能学习笔记】1_人工智能基础

本系列是个人学习《阿里云人工智能工程师ACA认证免费课程&#xff08;2023版&#xff09;》的笔记&#xff0c;仅为个人学习记录&#xff0c;欢迎交流&#xff0c;感谢批评指正 人工智能概述 智能的三大能力&#xff1a;感知、记忆与思维、学习与适应能力人工智能的定义 明斯基…

正规表达式例题

解析&#xff1a;从题意可知&#xff0c;a可以有零个或多个&#xff0c;b有1个或多个 选项A&#xff1a;这里a至少有1个&#xff0c;不符合题意 选项B&#xff1a;a^*bb^*&#xff0c;a是0个或多个&#xff0c;b可以是1个或多个&#xff0c;符合题意 选项C和选项D&#xff0…

Camunda调用子流程案例

调用子流程 调用子流程是指子流程在主流程的外面。子流程一般是多个流程可重用的流程&#xff0c;也可以独立调用子流程。 可以对比编程中的方法抽取。子流程运行时&#xff0c;主流程也是等待状态。子流程结束&#xff0c;主流程继续。 立即体验&#xff0c;请访问JeecgFlow …

AWTK HTML View 控件更新

AWTK HTML View 控件基于 Lite HTML 实现&#xff0c;从最初的版本开始&#xff0c;3 年多过去了&#xff0c;Lite HTML 做了大量的更新&#xff0c;最近抽空将 AWTK HTML View 控件适配到最新版本的 Lite HTML&#xff0c;欢迎大家使用。 AWTK HTML View 控件。HTML View 控件…

Android 开发避坑经验第三篇:RecyclerView 高效使用与常见问题解决

RecyclerView 是 Android 应用开发中最常用的 UI 组件之一,通常用于显示大量数据列表。尽管功能强大,但如果使用不当,会导致性能问题、数据错乱或滚动卡顿等问题。在本篇文章中,我们将探讨 RecyclerView 的一些常见坑点,提供解决方案,并附带代码示例。 1. 坑点:ViewHol…

LeetCode:3177. 求出最长好子序列 II 哈希表+动态规划实现N*K时间复杂度

3177. 求出最长好子序列 II 题目链接 题目描述 给你一个整数数组 nums 和一个非负整数k 。如果一个整数序列 seq 满足在下标范围 [0, seq.length - 2] 中 最多只有 k 个下标i满足 seq[i] ! seq[i 1] &#xff0c;那么我们称这个整数序列为好序列。请你返回 nums中好子序列的…

玩转Python Turtle库,实现满屏飘字的魔法!

前言 本文将教你如何使用Python的Turtle库&#xff0c;通过简单的编程实现满屏飘字的炫酷效果。无需复杂的编程知识&#xff0c;跟着我们的步骤&#xff0c;你也可以成为编程小达人&#xff01; 效果展示 开发过程 一、准备工作 首先&#xff0c;确保你的电脑上已经安装了Py…

12. GIS地图制图工程师岗位职责、技术要求和常见面试题

本系列文章目录&#xff1a; 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

python如何读取excel文件内的数据

目录 前言一、安装openpyxl二、读取Excel数据总结前言 在Python中读取Excel数据,最常用的库之一是openpyxl(用于.xlsx格式)和xlrd(尽管xlrd从版本2.0开始不再支持.xlsx,仅支持旧的.xls格式)。然而,对于大多数现代应用来说,openpyxl是一个更好的选择,因为它支持.xlsx格…

2. GIS数据工程师岗位职责、技术要求和常见面试题

本系列文章目录&#xff1a; 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

基础学习之——Docker 的基本概念和优势,以及在应用程序开发中的实际应用。

Docker是一种开源的容器化平台&#xff0c;可以将应用程序及其所有依赖项打包在一个容器中&#xff0c;实现跨平台、可移植和可扩展的部署。下面是Docker的基本概念和优势&#xff1a; 容器&#xff1a;Docker使用容器来打包应用程序及其依赖项&#xff0c;容器是一个独立、可执…

COD论文笔记 BiRefNet

本质还是一个 U 型编码器解码器结构的分割模型。 我可以考虑将©和(d)结合&#xff0c;即对解码器的输入不进行 patchify,同时在各个阶段引入梯度参考信息 最近的相关工作&#xff0c;中间监督、额外先验(频率&#xff0c;梯度&#xff0c;边缘等)取得不错效果 作者观察到…