Jmeter压测实战:Shell脚本实现Linux服务器性能实时监控与自动化集成
2026/7/3 20:05:36
这段代码要实现的功能是:把一个数组里的所有 0 都移到数组末尾,非 0 元素保持原来的先后顺序。比如:输入[0,1,0,3,12]→ 输出[1,3,12,0,0]。
void swap(int *a, int *b) { // 定义交换函数,a和b是两个整数的"地址" int t = *a; // *a表示"取地址a里的值",先把a地址的值存到临时变量t *a = *b, *b = t; // 把b地址的值放到a地址,再把t的值放到b地址(完成交换) }大白话解释:
int *a理解成 “一张纸条,上面写着一个整数的家庭住址”;*a就是 “根据这个住址找到对应的人,拿到他手里的数字”;举个例子:如果a是数组第 0 个元素的地址(值是 0),b是数组第 1 个元素的地址(值是 1),调用swap(a,b)后,两个位置的值就变成 1 和 0 了。
先记住两个指针的 “分工”:
void moveZeroes(int *nums, int numsSize) { // nums是数组地址,numsSize是数组长度 int left = 0, right = 0; // 两个指针都从数组第0个位置(最左边)出发 while (right < numsSize) { // 侦察兵没走到数组末尾,就一直找 if (nums[right]) { // 如果侦察兵找到的元素不是0(非0值在C里算"真") swap(nums + left, nums + right); // 把这个非0元素搬到搬运工的位置 left++; // 搬运工往右走一步,准备接下一个非0元素 } right++; // 侦察兵不管找没找到,都往右走一步继续找 } }我们用nums = [0,1,0,3,12],numsSize = 5来一步步走:
| 步骤 | right 指针位置 | nums [right] 值 | 是否非 0 | 执行操作 | left 指针位置 | 数组变化 |
|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 否 | 只走 right | 0 | [0,1,0,3,12] |
| 2 | 1 | 1 | 是 | 交换 left (0) 和 right (1),left+1 | 1 | [1,0,0,3,12] |
| 3 | 2 | 0 | 否 | 只走 right | 1 | [1,0,0,3,12] |
| 4 | 3 | 3 | 是 | 交换 left (1) 和 right (3),left+1 | 2 | [1,3,0,0,12] |
| 5 | 4 | 12 | 是 | 交换 left (2) 和 right (4),left+1 | 3 | [1,3,12,0,0] |
| 6 | 5 | - | 退出循环 | - | 3 | 最终结果 [1,3,12,0,0] |
大白话复盘这个过程:
nums + left是什么意思?nums是数组第一个元素的地址,nums + left就是 “从数组开头往后数 left 个位置的地址”;nums + 0= 数组第 0 个元素的地址,nums + 1= 数组第 1 个元素的地址,等价于&nums[left]。if (nums[right])为什么能判断非 0?if (nums[right])等价于if (nums[right] != 0),只是简写而已。*符号能 “取地址里的值”;nums的本质在 C 语言里,数组名nums本身就是一个指针,它指向数组第一个元素的地址(可以理解成 “数组的家门牌”)。比如数组nums = [0,1,0,3,12]:
nums→ 等价于&nums[0]→ 指向第 0 个元素(0)的地址;nums[0]→ 取第 0 个元素的值(0);nums[1]→ 取第 1 个元素的值(1)。nums + left是什么?nums + left是指针的算术运算,意思是:从数组的起始地址(nums)往后 “走left步”,指向数组第left个元素的地址。
&nums[left](&是取地址符号);left=0→nums+0=&nums[0](第 0 个元素地址);left=1→nums+1=&nums[1](第 1 个元素地址);left=2→nums+2=&nums[2](第 2 个元素地址)。代码里调用swap(nums + left, nums + right),本质是:
nums数组中第left个元素的地址(nums+left);nums数组中第right个元素的地址(nums+right);swap函数,交换这两个地址对应的值。还是用nums = [0,1,0,3,12],当left=0、right=1时:
nums + left=nums+0=&nums[0]→ 第 0 个元素(0)的地址;nums + right=nums+1=&nums[1]→ 第 1 个元素(1)的地址;swap后,这两个地址的值被交换,数组变成[1,0,0,3,12]。再比如left=1、right=3时:
nums+1=&nums[1](值为 0);nums+3=&nums[3](值为 3);[1,3,0,0,12]。&nums[left]反而用nums+left?两者效果完全一样,只是写法不同:
&nums[left]是 “数组下标写法”,更直观,新手容易懂;nums+left是 “指针算术写法”,是 C 语言更底层的写法,很多程序员习惯这么写;nums+left换成&nums[left],功能完全不变。nums + left等价于&nums[left],都是取数组第left个元素的地址;swap函数的必须是 “地址”(指针),因为swap需要通过地址修改原数组的值;nums+left的核心是:从数组起始地址往后偏移left个元素的位置。