C语言——指针

一、指针

1.指针的强制转换

2.指针的加法运算

(1)p+n:往后挪n * sizeof(基类型)个字节;

(2)常用于整型数组中;

          (1)a[i] <=> *(a + i);

`        (2)*a++回导致编译报错,*p++可以,因为p是指针变量,但是a是指针常量;*(a+i)可以;

3.指针与数组的相爱相杀

(1)数组的逆序
 

void reverseArry(int *a,int len)
{
	int i;
	for(i = 0 ;i < len / 2;++i)
	{
		int t;
		t = *(a+i);
		*(a+i) = *(a + len - i - 1);
		*(a + len - i -1) = t;
	}
}
int main(void)
{
	int a[]={1,2,3,4,5,6,7,8,9,0};
	int len = sizeof(a)/ sizeof(a[0]);
	reverseArry(a,len);
	printArry(a,len);
		return 0;
}
void swap(int *a,int *b)
{
	int t;
	t = *a;
	*a = *b;
	*b = t;
}
void reverseArryP2(int *a,int len)
{
	int i;
	for(i = 0 ;i < len / 2;++i)
	{
		swap((a+i),(a+len - i -1));
	}
}
int main(void)
{
	int a[]={1,2,3,4,5,6,7,8,9,0};
	int len = sizeof(a)/ sizeof(a[0]);
	reverseArryP2(a,len);
	printArry(a,len);
		return 0;
}

​​​​​​(2)找出最大值

int maxOfArry(int *a,int len)
{
	int i,max = *a;
	for(i = 0 ;i < len;++i)
	{
		if(max < *(a+i))
		{
			max = *(a+i);
		}
		
	}
	return max;
}
int main(void)
{
	int a[]={1,2,3,4,5,6,7,8,9,0};
	int len = sizeof(a)/ sizeof(a[0]);
    printf("%d\n",maxOfArry(a,len));
	return 0;
}

(3)冒泡排序

//冒泡
void bubbleSort(int *begin,int *end)
{
	int *p;
	for(end;end > begin;--end)
	{
		for(p = begin;p < end;++p)
		{
			if(*p > *(p + 1))
			{
				swap(p,p + 1);
			}
		}
	}
}

(4)插入排序 

//插入法
void inserSort(int *begin,int *end)
{
	int *q = begin;
	int t;
	for(begin;begin < end;++begin)
	{
		int *p = begin + 1;
		t = *p;
		while(p > q && *(p - 1) > t)
		{
			*p = *(p -1);
			--p;
		}
		*p = t;
	}
}

(5)选择排序

//选择
void choicesort(int *begin,int *end)
{
	int *p;
	for(begin;begin < end;++begin)
	{
		for(p = begin + 1;p <= end;++p)
		{
			if(*begin > *p)
			{
				swap(begin,p);
			}
		}
	}
}

3.为了杜绝野指针的出现,int *p = NULL/p =NULL,p称为空指针,空指针无法进行指针运算,他代表指针的状态,表示该指针指向的空间不可被访问;NULL:#define NULL(0);

4,指针型函数: 

5.指针的比大小:比的是地址的前后;但是注意要保持两个指针的基类型一致;

int a[] = {1,2,3,4,5,6,7,8,9,0};
int *p = a;
int *q = a+1;
printf("%d\n",q>p);

6.快速排序算法:迭代器+递归调用思想

void Qsort(int *begin, int *end)
{
	if(begin >= end)
	{
		return;
	}
	int t = *begin;
	int *q = end;
	int *p = begin;
 
	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);
}

7.查找

int *binaryFind(int *begin,int *end,int n)
{
	while(begin <= end)
	{
		int *mid;
		mid = (end - begin) / 2 + begin;
		if(*mid > n)
		{
			end = mid - 1;
		}
		else if(*mid < n)
		{
			begin = mid + 1;
		}
		else
		{
			return mid;
		}
	}
	return NULL;
}
//使用一对迭代器,并采用函数递归调用的方式实现二分查找
int *binaryFind(int *begin,int *end,int n)
{
	if (begin > end)
	{
		return 0;
	}
 
	int *mid;
	mid = (end - begin) / 2 + begin;
	if(*mid > n)
	{
		end = mid - 1;
	}
	else if(*mid < n)
	{
		begin = mid + 1;
	}
	else
	{
		return mid;
	}
	
	binaryFind(begin,end,n);
}

8.指针的运算注意事项

        (1)在加法两端必须是一个是指针一个是常数,不可以两端都是指针;

        (2)减号两端可以都是指针,必须要保证两个指针的基类型一致,相减之后的表达式时int型,差值是两个指针之间相差了几个基类型,差值的正负可以判断两个指针的前后位置;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值