例一:初识指针
#include<stdio.h>
int main(void)
{
int *p ;
int m ;
p = &m ;
return 0;
}
在第四行我们定义了一个指针变量,这个变量存储的是一个地址,我们都知道任何变量是在内存中某一个地址存储的,我们可以用这个指针变量来指向一个变量,比如在这个例子中。我们取了m变量的地址赋给了指针p,此时指针变量p存储的就是变量m的地址,也就是说指针p指向了m。在此基础上,我们可以用指针干更多的事情。
例二:利用指针修改数据
这个程序可以对两个数从小到大输出
#include<stdio.h>
swap(int *p1 , int *p2)
{
int tem;
tem=*p1;
*p1=*p2;
*p2=tem;
}
int main(void)
{
int a,b;
int *pd_1,*pd_2;
scanf("%d,%d",&a,&b);
pd_1=&a;
pd_2=&b;
if(a>b)
{swap(pd_1,pd_2);}
printf("a=%d,b=%d",a,b);
return 0;
}
我们用一个自定义函数swap来修改数据,参数是两个变量的指针,如上,就可以很方便的达到目标。
例三:指针与一维数组
#include<stdio.h>
int a[7],i,tem;
int *p=&a;
int f(int *a)
{
printf("\n");
*(p+1)=10;
}
int main(void)
{
for(i=0;i<=6;i++)
{a[i]=i+1;}
for(i=0;i<=6;i++)
{printf("%d ",a[i]);}
f(a);
for(i=0;i<=6;i++)
{printf("%d ",a[i]);}
return 0;
}
在这里我们先定义了几个全局变量,其中包含指针p和数组a。然后指针p指向数组a,此时如果我们同时输出指针p和数组a的a[0]地址,我们会发现这两者是完全相同的,也就是说,当我们令一个指针指向数组时,指针存储的是该数组的第一个数据的地址。那如果我们对这个指针加一呢?对了,就是这个数组的第二个数据。而且我们可以在自定义的函数中添加指针变量,然后利用指针修改该数组的值,这相当于我们可以使自定义的函数返回一个数组,非常方便。
例如:
这个程序可以对五个数排序
#include<stdio.h>
woc(int *book,int n)
{
int i,j,tem=0;
for(i=1;i<=5;i++)
{scanf("%d",&book[i]);}
for(i=1;i<=4;i++)
{for(j=1;j<=4;j++)
{if(book[j]>book[j+1])
{tem=book[j];
book[j]=book[j+1];
book[j+1]=tem;
}
}
}
for(i=1;i<=5;i++)
{printf("%d ",book[i]);}
}
int main(void)
{
int a[20],i;
woc(a,10);
return 0;
}
运行结果是
对五个数排序
例四:函数做函数的指针
先上一段代码
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
srand((unsigned)time(NULL));
double(*fp1)(double,double);
int(*fp2)();
fp1=pow;
fp2=rand;
printf("%lf,%d",fp1(2,5),fp2());
}
我们用语句double(*fp1)(double,double);定义了一个名为“fp1”的double型函数,并且这个函数有两个double类型的参数,令fp1=pow(pow是math.h里面的一个函数,用于计算幂值,如pow(2,5)表示2的5次方),这个时候fp1这个指针就指向了pow这个函数,同理,用语句int(*fp2)();定义了一个int型的函数fp2,令fp2=rand,没有参数。这样我们就可以让函数作为函数的参数了。