C
二级指针实战
//查看A个学生的B门课的成绩
不用指针函数操作,因为p在main函数里时,是个野指针,传过去时另一个野指针p2(本身也有个地址非p的地址)指向了p地址,然后对其操作,给p2赋值也是赋值的p2的地址,但函数调用结束后就注销了,p任然还是个野指针,所以要用二级指针,将p的地址传给一个二级指针,对其操作后,操作的就是p的实际地址,调用结束后p已经正确调用完成了。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void initData(int (*p)[4]){
srand((unsigned)time(NULL));
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
*(*(p + i) + j) = rand()%50 + 50;
}
}
}
void printData(int (*p)[4]){
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%-6d",*(*(p + i) + j));
}
puts("");
}
}
void findStu(int (*p)[4],int **p2){
int n;
printf("请输入想查看的学生号:\n");
scanf("%d",&n);
*p2 = (int *)(p + n - 1);
}
int* findFStu(int (*p)[4],int *p2){
printf("开始寻找不及格的学生:\n");
int n = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
if (*(*(p + i) + j) < 60)
{
*(p2 + n) = i + 1;
n++;
break;
}
}
}
return p2;
}
int main(){
int a[3][4];
int *p;
int b[3];
int *p2;
initData(a);
printData(a);
findStu(a,&p);
for (int i = 0; i < 4; i++)
{
printf("%-6d",*p++);
}
puts("");
p2 = findFStu(a,b);
for (int i = 0; *(p2 + i) != 0; i++)
{
printf("%-6d",*(p2 + i));
}
}
|