先前对C语言有一定的的入门知识,但是由于没有深入学习,就一直停留在了这个水平。如今有时间了,重操旧业,开始“吃剩饭”,重新学习C语言 了。听大牛们都说,要真正的学懂某些东西,不是自己看明白了就可以了,最好的学习方法是把自己明白的讲出来,讲给别人,让被人也理解了,这才是真正的掌握了。我也就自己开了博客,来把自己学到的总结,记录下来。。。。。。
正文
相信了解过C语言的都知道,指针是C语言学习中最重点的一部分,同时如果它不是最难的知识点的话,也是最难理解的知识点之一。下面我通过自己对
优先排序和冒泡排序的理解,来说明自己对指针的理解。
先来看看优先排序的示例:
//优先排序算法,在主函数中实现排序 #include<stdio.h> int main() { int a[10]; int n , i , j; int index , temp; //输入要输入排序的数字个数 printf("Enter n:"); scanf("%d" , &n); //输入要排序的数,读入到数组a[10]中 printf("Enter %d numbers:" , n); for(i = 0;i < n;i ++) { scanf("%d" , &a[i]); } /***********优先排序,从小到大排列********************************** *大循环执行n-1次,小循环每次从大循环加1后开始执行 *每次执行一个小循环,将大循环初始的下标换做这一轮最小的数对应的下表 */ for(i = 0;i < (n - 1);i ++) { index = i; for(j = (i + 1) ;j < n;j ++) { //找出每一轮排序时最小的数对应的下表 if(a[j] < a[index]) { index = j; } } //交换这一轮比较中的起始数与最小数 temp = a[index]; a[index] = a[i]; a[i] = temp; } //输出排序后的数组值 for(i = 0;i < n;i ++) { printf("%3d" , a[i]); } printf("\n"); return 0; }
蓝色标注的为此排序函数的关键部分,我们可以将数组看成是指针常量。
通过含有指针的函数,将这个程序改写为指针的形式后如下。
//优先排序算法
#include<stdio.h>
void priority_sort(int * , int );
int main()
{
int a[10];
int n , i;
//输入要输入排序的数字个数
printf("Enter n:");
scanf("%d" , &n);
//输入要排序的数,读入到数组a[10]中
printf("Enter %d numbers:" , n);
for(i = 0;i < n;i ++)
{
scanf("%d" , &a[i]);
}
priority_sort(a , n);
//输出排序后的数组值
for(i = 0;i < n;i ++)
{
printf("%3d" , a[i]);
}
printf("\n");
return 0;
}
void priority_sort(int a[] , int n)
{
int i , j , index;
int temp;
/***********优先排序,从小到大排列**********************************
*大循环执行n-1次,小循环每次从大循环加1后开始执行
*每次执行一个小循环,将大循环初始的下标换做这一轮最小的数对应的下表
*/
for(i = 0;i < (n - 1);i ++)
{
index = i;
for(j = (i + 1) ;j < n;j ++)
{
//找出每一轮排序时最小的数对应的下表
if(a[j] < a[index])
{
index = j;
}
}
//交换这一轮比较中的起始数与最小数
temp = a[index];
a[index] = a[i];
a[i] = temp;
}
}
写到这里,我自己就比较明白了。根据课本上说的,要想实现函数返回多个值,必须要用到指针。那么怎样才能够用指针实现调用的函数返回需要的值呢?其实,直白的说就是在调用函数时,使用该变量的地址,而在函数中,我们就是操作这个地址对应的形参的内容,这样就可以实现主函数变量的值的改变了。
下面是使用指针实现的冒泡排序的程序。
#include<stdio.h>
void maopao_sort(int * , int );
int main()
{
int a[10];
int n , i;
printf("Enter n:");
scanf("%d" , &n);
printf("Enter %d numbers:" , n);
for(i = 0;i < n;i ++)
{
scanf("%d" , &a[i]);
}
maopao_sort(a , n);
for(i = 0;i < n;i ++)
{
printf("%3d" , a[i]);
}
printf("\n");
return 0;
}
void maopao_sort(int *p , int n)
{
int i , j;
int t;
for(i = 1;i < n;i ++)
{
for(j = 0;j < (n - i);j ++)
{
if((*(p+j)) > (*(p+j+1)))
{
t = *(p+j+1);
*(p+j+1) = *(p+j);
*(p+j) = t;
}
}
}
}