## 灵魂指针，教给（二）

news/2024/4/21 12:11:17/文章来源:https://blog.csdn.net/Miracle_86/article/details/136568303

### 一、数组名的理解

``````int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = &arr[0];``````

``````#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("&arr[0] = %p\n", &arr[0]);printf("arr = %p\n", arr);return 0;
}``````

``````#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("%d\n", sizeof(arr));return 0;
}``````

sizeof(数组名),在sizeof中单独存放数组名，这里的数组代表整个数组，计算的是整个数组的大小，单位为字节

&数组名，这里的数组名也表示整个数组，取出的是整个数组的地址（整个数组的地址和数组首元素地址是有区别的）。

``````#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("&arr[0] = %p\n", &arr[0]);printf("arr = %p\n", arr);printf("&arr = %p\n", &arr);return 0;
}``````

来看结果：

``````#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("&arr[0] = %p\n", &arr[0]);printf("&arr[0]+1 = %p\n", &arr[0]+1);printf("arr = %p\n", arr);printf("arr+1 = %p\n", arr+1);printf("&arr = %p\n", &arr);printf("&arr+1 = %p\n", &arr+1);return 0;
}``````

### 二、使用指针访问数组

``````#include <stdio.h>
int main()
{int arr[10] = {0};//输⼊int i = 0;int sz = sizeof(arr)/sizeof(arr[0]);//输⼊int* p = arr;for(i=0; i<sz; i++){scanf("%d", p+i);//scanf("%d", arr+i);//也可以这样写}//输出for(i=0; i<sz; i++){printf("%d ", *(p+i));}return 0;
}``````

``````#include <stdio.h>
int main()
{int arr[10] = {0};//输⼊int i = 0;int sz = sizeof(arr)/sizeof(arr[0]);//输⼊int* p = arr;for(i=0; i<sz; i++){scanf("%d", p+i);//scanf("%d", arr+i);//也可以这样写}//输出for(i=0; i<sz; i++){printf("%d ", p[i]);}return 0;
}``````

### 三、一维数组传参本质

C语言中的工具箱——函数-CSDN博客

``````#include <stdio.h>
void test(int arr[])
{int sz2 = sizeof(arr)/sizeof(arr[0]);printf("sz2 = %d\n", sz2);
}
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};int sz1 = sizeof(arr)/sizeof(arr[0]);printf("sz1 = %d\n", sz1);test(arr);return 0;
}``````

### 四、冒泡排序

``````//⽅法1
#include<stdio.h>
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{int i = 0;for(i=0; i<sz-1; i++){int j = 0;for(j=0; j<sz-i-1; j++){if(arr[j] > arr[j+1]){int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}
}
int main()
{int arr[] = {3,1,7,5,8,9,0,2,4,6};int sz = sizeof(arr)/sizeof(arr[0]);bubble_sort(arr, sz);for(int i=0; i<sz; i++){printf("%d ", arr[i]);}return 0;
}``````

我们来看第二种优化后的方法：

``````//⽅法2 - 优化
#include<stdio.h>
void bubble_sort(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]){flag = 0;//发⽣交换就说明，⽆序int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}if (flag == 1)//这⼀趟没交换就说明已经有序，后续⽆序排序了break;}
}
int main()
{int arr[] = { 3,1,7,5,8,9,0,2,4,6 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}``````

### 五、二级指针

**ppa = 30，等价于*pa = 30，等价于a  = 30。

### 六、指针数组

指针数组是用来存放指针（地址）的。

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

C语言中的百宝箱——数组（2）-CSDN博客

``````#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*的，就可以存放在parr数组中int* parr[3] = { arr1, arr2, arr3 };int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 5; j++){printf("%d ", parr[i][j]);}printf("\n");}return 0;
}``````

运行结果如下：

### 包含字母数字及特殊字符 三种组合的正则两种写法

//长度8~16位&#xff1b;包含字母、数字及特殊字符 #\$%^&*_-//正则1 写法&#xff1a;let reg_1 /^(?![A-Za-z0-9]\$)^(?![A-Za-z#\$\%^&*_\-]\$)^(?![0-9#\$\%^&_*\-]\$)([A-Za-z0-9#\$\%^&*_\-]{8,16})\$///正则2 写法&#xff1a;let reg_2 /^(?![A-Za-z#\$%…

### kafka如何保证消息顺序性?

kafka架构如下&#xff1a; Kafka 保证消息顺序性的关键在于其分区&#xff08;Partition&#xff09;机制。在 Kafka 中&#xff0c;每个主题&#xff08;Topic&#xff09;可以被分割成多个分区&#xff0c;消息被追加到每个分区中&#xff0c;并且在每个分区内部&#xff0c…

### 3DES算法的起源与演进：保障信息安全的重要里程碑

title: 3DES算法的起源与演进&#xff1a;保障信息安全的重要里程碑 date: 2024/3/8 21:25:19 updated: 2024/3/8 21:25:19 tags: 3DES算法起源安全性增强三次迭代加密密钥管理复杂效率对比AES应用场景广泛Python实现示例 一、3DES算法的起源与演进 3DES算法是DES算法的增强版…

### 目标检测论文模型笔记——YOLO系列

1. YOLOv1的核心思想&#xff1a; YOLOv1&#xff1a;使用整张图作为输入&#xff0c;直接在输出层回归bounding box和类别&#xff1b;&#xff08;one-stage&#xff09;Faster RCNN&#xff1a;使用用整张图作为输入&#xff0c;但整体采用了RCNN&#xff1a; proposalclas…

### 18个惊艳的可视化大屏（第23辑）：电子政务，一目了然如胸。

hello&#xff0c;我是贝格前端工场老司机&#xff0c;这是第23期了&#xff0c;本次带来可视化大屏在电子政务领域的应应用案例&#xff0c;喜欢文章的别忘点赞关注&#xff0c;文章底部也有其他行业的案例。 数据展示与监控&#xff1a; 可视化大屏可以将政务数据以图表、地…

### Java后端八股笔记

Java后端八股笔记 Redis八股 上两种都有可能导致脏数据 所以使用两次删除缓存的技术&#xff0c;延时是因为数据库有主从问题需要更新&#xff0c;无法达到完全的强一致性&#xff0c;只能达到控制一致性。 一般放入缓存中的数据都是读多写少的数据 业务逻辑代码&#x1f44…

### Node.Js编码注意事项

Node.js 中不能使用 BOM 和 DOM 的 API&#xff0c;可以使用 console 和定时器 APINode.js 中的顶级对象为 global&#xff0c;也可以用 globalThis 访问顶级对象 浏览器端js的组成 Node.js中的JavaScript组成 相比较之下发现只有console与定时器是两个API所共有的&#xff…

### Linux运维：实现光盘开机自动挂载、配置本地yum源教程

Linux运维&#xff1a;实现光盘开机自动挂载、配置本地yum源教程 一、光盘开机自动挂载1、检查光驱设备2、创建挂载点3、编辑/etc/fstab文件4、测试挂载 二、配置本地yum源(挂载光盘或ISO文件)1、挂载ISO文件2、创建YUM仓库配置文件3、清理YUM缓存并测试 &#x1f496;The Begi…