指针——C的灵魂
一、指针函数认知
指针函数,说的就是函数,函数的特征点就是返回值为指针。一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址。其概念与以前类似,只是返回值的类型是指针类型而已。例如:
int * a(int x, int y);
因为 ( ) () () 优先级更高,所以 a a a 与后面的括号结合,是函数名,调用它以后能得到一个 i n t ∗ int * int∗ 型(指向整型数据)的指针,即整型数据的地址。x和y是函数 a a a 的形参,为整型。
关于 int *p;
和 int* p;
还有一定的说法, int *p;
表示定义一个指针变量,而 int* p;
表示定义一个变量,这个变量类型是
i
n
t
int
int 指针类型。这些区别再C与指针这本书上有详细的讲解。
既然这样,我们完全可以把指针函数定义成这样:
int* a(int x, int y);
这样会看的更清晰,这是一个返回值为指针的指针函数。
二、指针函数练习与应用
题目:有a个学生,每个学生有b门课的成绩。要求在用户输入学生序号以后,输出该学生的全部成绩,用指针函数来实现。
#include<stdio.h>
int* getPpos(int pos, int (*pstu)[4]) //第二形参为一个数组指针
{
int *p;
p = *(pstu+pos); //由于pstu为面向父数组的指针,为了解决p和pstu类型不匹配,所以进行*取得面向子数组的指针
return p; //返回一个指向子数组的指针,即地址
}
int main()
{
int scores[3][4] = {
{11,22,33,44},
{55,66,77,88},
{34,54,57,87}
};
int *ppos;
int pos;
printf("请输入你想要查看学生成绩的号数:\n");
scanf("%d",&pos);
ppos = getPpos(pos, scores);
for(int i = 0;i<4;i++){
printf("%d ",*ppos++);
}
return 0;
}
运行结果: