常见的指针指针运算说明
1.指针与整数的加减运算
对指针可以进行加法运算,即p + n或者p - n。其结果依旧是一个是一个指针,新的指针是在原来的地址值基础上加上/减去n *(sizeof(指针指向的数据类型))个字节。
示例:
#include<stdio.h>int main(void)
{int a[] = {1,2,3,4,5};int *p = a; //p指向a[0]printf("%d\n",*P); //输出结果为1++p; //因为int占4个字节,所以地址值+sizeof(int)=4个字节printf("%d\n",*p); //输出结果为2return 0;
}
2. 指针与指针之间的减法运算
指针和指针之间可以进行减法运算,但是要保证两种(指针指向的数据类型)一致并且必须指向同一数组,结果为(p1地址 - p2地址) / sizeof(指针类型),即元素个数差。
示例:
#include<stdio.h>int main(void)
{int a[] = {1,2,3,4,5};int *p1 = a;int *p2 = &a[4];printf("%d\n",p2 - p1);return 0;
}
3. 指针与指针之间的关系运算
指针和指针之间可以进行关系运算,但是要保证两种(指针指向的数据类型)一致或者强制类型转换为同一类型并且必须指向同一数组。
可使用的运算符:==、!=、<、>、<=、>=。
示例:
#include<stdio.h>int main(void)
{int a[] = {1,2,3,4,5};int *p1 = a;int *p2 = a;if(p1 = p2){printf("%p=%p\n",p1,p2);}p2++;if(p1 < p2){printf("%p<%p\n",p1,p2);}return 0;
}
注意事项:
指针和指针之间不能进行加法、乘法、除法等运算(编译会报错)。
只有指向同一数组的指针,减法和关系运算才有意义,否则结果未定义。
指针与整数的加减,结果仍为指针,指向新的位置(需确保不越界访问)。
指针算法练习
1 使用不同算法打印数组
#include<stdio.h>void printArray(int *begin,int *end) //遍历打印
{while(begin <= end){printf("%d ",begin);++begin;}
}void printArray1(int *begin,int *end) //递归调用打印数组
{if(begin > end){return ;}else{printf("%d ",begin);printArray1(begin + 1,end);}
}int main(void)
{int a[] = {1,2,4,3,5,7,6,8,9,10};int len = sizeof(a) / sizeof(*a);printArray(a, a + len - 1);printArray1(a,a + len - 1)return 0;}
2.使用不同算法逆序数组
#include<stdio.h>void swap(int *a,int *b) //互换
{int t;t = *a;*a =*b;*b = t;
}void reserve(int *begin,int *end)
{while(begin < end){swap(begin,end);++begin;--end;}
}void reserve1(int *begin,int *end)
{if(begin >= end){return ;}else{swap(begin,end);reserve1(begin + 1,end - 1);}
}int main(void)
{int a[] = {1,2,4,3,5,7,6,8,9,10};int len = sizeof(a) / sizeof(*a);reverse(a, a + len -1);reverse1(a, a + len -1);printArray(a,a + len - 1);return 0;
}
快速排序
快速排序是一种高效的排序算法,基于“分治法”思想,通过选取一个基准元素,将数组分为两部分(小于基准和大于基准),再递归排序两部分。其平均时间复杂度为O(n log n),是实际应用中常用的排序算法。
快速排序的核心步骤
1. 选择基准(pivot):从数组中选一个元素作为基准(通常选首元素、尾元素或中间元素)。
2. 分区(partition):将数组中小于基准的元素放在基准左边,大于基准的元素放在右边(等于基准的元素可放任意一侧)。
3. 递归排序:对基准左右两侧的子数组重复上述步骤,直到子数组长度为0或1。
#include<stdio.h>void printArray(int *begin,int *end) //遍历打印
{while(begin <= end){printf("%d ",begin);++begin;}
}void qSort(int *begin,int *end) //快排
{ int *p = begin;int *q = end;int t = *begin;if(begin > end){return ;}else{while(p < q){while(p < q && *q >= t){--q;}while(p < q && *p <= t){++p;}swap(p, q);}swap(begin,p);qSort(begin,p - 1);qSort(p + 1,end);}
} int main(void)
{int a[] = {1,2,4,3,5,7,6,8,9,10};int len = sizeof(a) / sizeof(*a);qSort(a,a + len - 1);printArray(a,a + len - 1);return 0;
}