关闭

C语言指针应用--互换两个数&冒泡排序

标签: c语言指针
745人阅读 评论(0) 收藏 举报

交换两个数,这在C语言中是个很简单的问题,比如我们在谭浩强的那本C语言教材里,可以看到

void swap(int a, int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}

原理就是借助一个中间值存储第一个值,然后进行数值互换,但是这个程序存在一个问题,因为这个swap函数的两个参数进行的是值传递,如果在另外一个函数里去调用这个函数,会出现无法将两个数互换的结果,比如下面这段程序

int main(int argc, char *argv[]) {

	int numb1 = 3, numb2 = 6;
	swap(numb1,  numb2);
	printf("%d, %d", numb1,  numb2);
}
输出的结果是3,6,而不是想象中的交换后的6,3,那么正确的写法应该是怎样的呢?指针能够解决这个问题

void swap(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
然后在需要调用的地方
swap(&numb1,  &numb2);

注意,函数的参数用了&取地址符号,也就是传递的是两个数的地址,在swap函数里就直接对numb1和2进行操作了,于是可以顺利实现两个数字的互换。由于在冒泡法排序里要用到两个数字互换的程序,所以这里记录下利用指针写的冒泡法排序的程序。

void sort(int *data, int dataLengh, int direction)
{
	int i, j;
	for(i=dataLengh-1; i>0; i--)
	{
		for(j=0; j<i; j++)
		{
			if(direction == 0)//from small to large numbers
			{
				if(*(data+j) > *(data+j+1))
				{
					swap((data+j), (data+j+1));
				}
			}
			else//fron large to small numbers
			{
				if(*(data+j) < *(data+j+1))
				{
					swap((data+j), (data+j+1));
				}
			}
		}
	}
}
在调用sort函数时,按照如下下发就可以了
int shuzu[] = {10,2,30,10,2,30};
sort(shuzu, sizeof(shuzu)/sizeof(shuzu[0]), 0);
这里需要注意的一点是sort函数的第二个参数dataLength是必须要的,我之前想利用sizeof(shuzu)/sizeof(shuzu[0]=6这样的道理,在sort函数里用sizeof(data)/sizeof(*data)来代替dataLength,结果发现未能如愿以偿,原因就是sort函数的第一个参数data是个指针,也就是地址,sizeof(data)是4,而不是例子中的sizeof(shuzu)=20,这里编译器是不知道这个地址后会有多少个数据,需要人为指定长度,这个懒是偷不了了。








0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12359次
    • 积分:244
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:4篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论