常见的指针指针运算说明
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); //输出结果为2
return 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.选择基准:从数组中选一个元素作为基准(通常选首元素)。
2.分区:将数组中小于基准的元素放在基准左边,大于基准的元素放在右边(等于基准的元素可放任意一侧)。
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;
}