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

2024-09-08 05:52
文章标签 语言 进阶 指针

本文主要是介绍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字节

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

这篇关于C语言进阶版第8课—指针(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147304

相关文章

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)