当前位置: 首页 > news >正文

C语言第15讲

数组名的理解

                数组名就是首元素地址

但又两个例外:

                1.sizeof(arr)

                2.&arr

                这两个数组名都表示整个数组

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>int main()
{int arr[10] = { 0 };printf("%d\n", sizeof(arr));printf("%p\n", &arr);printf("%p\n", &arr+1);return 0;
}

[ ] 的详细理解

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9 };int sz = sizeof(arr) / sizeof(arr[0]);int* p = arr;for (int i = 0; i < sz; i++){printf("%d ", *(p + i));printf("%d ", *(i + p));printf("%d ", p[i]);printf("%d ", arr[i]);printf("%d ", *(arr + i));printf("%d ", *(i + arr));printf("%d ", i[p]);printf("%d ", i[arr]);printf("\n");}return 0;
}

                a + b = b + a    +是操作符

                [ ] 也是操作符 p[ i ] = i[ p ]

                因为 arr[ i ] 在计算机中会翻译成 *(arr + i)

                且 p 和 arr 都是首元素地址,所以以上所有表达式都是一样的意思

一维数组传参的本质

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>void print(int arr[], int sz)
{for (int i = 0; i < sz; i++)printf("%d ", *(p + i));
}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9 };int sz = sizeof(arr) / sizeof(arr[0]);print(arr, sz);return 0;
}

                以上代码我们将 sz 转移至函数内部计算会发生什么?

在内部计算:sz = 1

                因为函数在传一维数组时,传的是首元素地址,放入函数内部计算时

                sizeof(arr) / sizeof(arr[0])

                会被翻译为 指针变量 / 首元素大小 ,x86 = 1,x64 = 2

数组传参的时候,形参可以写成数组的形式 int arr[ ],但本质还是指针变量

冒泡排序

                核心思想:两两相邻元素进行比较

例:将 1 2 3 4 5 6 7 8 9 改为降序

                冒泡排序每一趟解决一个数的排序

                第一趟:需要进行 n(总元素个数) - 1次比较

                第二趟:由于第一趟已经解决一个数的排序,所以比较此次会再次减少一次

                每趟解决一个数据,最后一趟解决2个数据,所以需要总趟数 n(总元素个数) - 1趟次

                所以比较次数的写法:

for (int i = 0; i < sz - 1; i++)
{for (int j = 0; j < sz - 1 - i; j++){}
}

                且每趟比较完,下趟数据得从头开始比较,所以 j = 0; 为比较顺序的重置

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>void bubble_sort(int* p, int sz)
{for (int i = 0; i < sz - 1; i++){int flag = 1;for (int j = 0; j < sz - 1 - i; j++){if (p[j] > p[j + 1]){int tmp = p[j];p[j] = p[j + 1];p[j + 1] = tmp;flag = 0;}}if (flag == 1){break;}}
}void print(int* p, int sz)
{for (int i = 0; i < sz; i++){printf("%d ", p[i]);}
}int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);print(arr,sz);return 0;
}

                bubble_sort 函数内的 flag 为冒泡排序的优化,如果一趟中,没发生位置的交换,说明已经排序完成,后续趟数的比较,不用再进行,直接跳出循环

二级指针

int a = 10;
int* p = &a;
int** pp = &p; 

                pp就是二级指针,将一级指针的地址存入另一个变量中,这个变量就是二级指针

                int* (*) 表示pp是指针变量

                (int*) * 表示pp指向的对象为指针变量

和一级指针一样:直接使用pp

printf("%p",*pp);
printf("%d",*(*pp));

                *pp+1 意思是 p的指针加一个int *的内存

                x86,p的地址加4

                x64,p的地址加8

并不是a的地址

*pp分两类,可以利用 printf %d 打印内容 %p打印地址

指针数组

                (谁在后面,谁是名称)指针数组就是数组

                字符数组:存放字符的数组

                整形数组:存放整形的数组

                

                字符数组:存放指针的数组

书写:int*(元素类型) arr[ ];

指针数组模拟二维数组 

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };int* arr[] = { arr1,arr2,arr3 };//使用直接利用二维数组方式for (int i = 0; i < 3; i++) {for (int j = 0; j < 5; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

http://www.dtcms.com/a/389359.html

相关文章:

  • windows 下使用 bat 批处理运行 Chrome 无头模式刷一波访问量
  • 项目名称:基于Qt框架的跨平台天气预报应用程序​​
  • 王自如重操旧业拆箱iPhone:苹果新机发售旧机发热是惯例……
  • 鸿蒙Next Core File Kit:文件管理的高效安全之道
  • Java-128 深入浅出 MySQL MyCat 分布式数据库中间件详解:架构、功能与应用场景
  • gozero使用gRPC-gateway生成http网关
  • Go语言100个实战案例-项目实战篇:股票行情数据爬虫
  • Python开发最新 PyCharm 2025使用(附详细教程)
  • 【session基础】
  • 客户流失预警中uplift建模案例、入门学习(二)
  • SSH远程管理工具
  • 4644电源芯片的介绍和使用
  • MIPI D-PHY布线规则
  • 《深入理解Java虚拟机》第四章节读书笔记:虚拟机性能监控、故障处理工具
  • ​​[硬件电路-251]:电源相关常见的专业术语
  • 日志中的SQL语句直接转为可执行的SQL
  • Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践
  • Nginx-RTMP-Module开源项目全解析:从基础部署到企业级应用实践
  • 新代系统如何输入期限密码
  • 【C++】STL--stack(栈)queue(队列)使用及其重要接口模拟实现
  • 计算机组成原理:奔腾系列机的虚存组织
  • 架构模式的双雄会:Reactor与Proactor的高并发哲学
  • 【C++】STL详解(八)—stack和queue的模拟实现
  • 【LeetCode Hot100----08-二叉树篇中(06-10),包含多种方法,详细思路与代码,让你一篇文章看懂所有!】
  • ARM(12) - ADC 检测光照强度
  • 网格生成引擎:设计原则、关键组件
  • 【开发AI】Spring AI Alibaba:集成AI应用的Java项目实战
  • Spark专题-第二部分:Spark SQL 入门(2)-算子介绍-Scan/Filter/Project
  • Selenium 自动化爬虫:处理动态电商页面
  • 无需Selenium:巧用Python捕获携程机票Ajax请求并解析JSON数据