//查看A个学生的B门课的成绩
不用指针函数操作,因为p在main函数里时,是个野指针,传过去时另一个野指针p2(本身也有个地址非p的地址)指向了p地址,然后对其操作,给p2赋值也是赋值的p2的地址,但函数调用结束后就注销了,p任然还是个野指针,所以要用二级指针,将p的地址传给一个二级指针,对其操作后,操作的就是p的实际地址,调用结束后p已经正确调用完成了。
#include#include #include 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)); } }



