Tôi sẽ hiển thị toàn bộ mã, nhưng vui lòng lưu ý các trích dẫn phía trên con trỏ vì đó là nơi tôi sẽ thảo luận về vấn đề của mình. Tôi sẽ cho bạn biết những gì tôi nghĩ đang xảy ra ở đó trong một bình luận trích dẫn. Mã biên dịch và chạy, tôi chỉ cần trợ giúp để hiểu các phần của mã.
#include
#include
int *get_data(int num_grades);
float calc_average(int num_grades, intgrade[]);
void display_average(float ave);
int main()
{
int num_grades = 10;
const int MAX_GRADE = 100;
Bên dưới khung báo giá này tại: int *result = get_data(num_grades);
Tại thời điểm này, tôi có hiểu biết khá đơn giản về con trỏ, vì tôi đã được giới thiệu về chúng gần đây, tuy nhiên tôi dường như không thể hiểu được điều gì sẽ xảy ra khi bạn gán một hàm cho một con trỏ. Điều tôi nghĩ sẽ xảy ra là. con trỏ đó int *kết quả nên trỏ vào một địa chỉ. Thay vào đó, nó trỏ đến một hàm cũng là một con trỏ, tôi nghĩ vậy. int *result = get_data(num_grades); ?
Tôi sẽ đặt phần còn lại của câu hỏi của mình vào hàm get_data bên dưới.
int *result = get_data(num_grades);
^ Trên ^
nếu (num_grades ==0)
printf("không có điểm trung bình\n");
khác
{
float ave = calc_average(num_grades, result);
display_average(ave);
}
miễn phí(kết quả);
return 0;
}
float calc_average(int num_grades, intgrade[])
{
đại lộ phao;
int i;
int sum = 0;
cho (i = 0; i < num_grades; i++)
{
tổng+=điểm[i];
}
ave = (float)sum/num_grades;
trở lại đại lộ;
}
void display_average(float ave)
{
printf("trung bình: %.2f\n", ave);
}
Bên dưới hộp trích dẫn này,
Tôi nghĩ đây là con trỏ hàm trả về con trỏ int?
Vì vậy, bên trong phần thân của hàm, chúng ta tạo một con trỏ mới, phân bổ bộ nhớ cho nó, gán điểm cho mỗi 'điểm', tôi nghĩ vậy, và sau đó tôi không chắc tại sao a[i] =grade lại hoạt động, đây là gì các chỉ mục đến từ đâu, tôi không hiểu tại sao điều này lại hoạt động nếu không có mảng nào được khai báo. Ai đó có thể giải thích điều gì đang xảy ra ở đây không? Tôi thực sự bối rối ở đây.
int *get_data(int num_grades)
{
int* a;
a = malloc(num_grades * sizeof(int));
int i;
cho (i = 0; i < num_grades; i++)
{
printf("nhập điểm: ");
lớp int;
scanf("%d", &grade);
nếu(điểm<=100)
{
a[i] = lớp;
}
khác
{
printf("điểm cần phải > 0 và <= 100\n");
Tôi--;
}
}
trả lại một;
^ Ở trên, toàn bộ chức năng này ^
}
get_data
là hàm trả về một con trỏ số nguyên. Đầu tiên:
int *result = get_data(num_grades);
Trong dòng này bạn không cung cấp kết quả
Thay vào đó, hãy cấp phát một con trỏ cho một hàm số_điểm
của một hàm được gọi là tham số kết quả .Nói cách khác, cho đến khi bạnget_data
Tính toán trong cơ thể củaMột
. sau đó:
int *get_data(int num_grades)
Đây là một tập tin có tên get_data
khai báo một hàm chấp nhận một int
tham số và trả về một con trỏ tới int
con trỏ. Bạn có thể sắp xếp lại các khoảng trống như thế này:
int* get_data(int num_grades)
Nếu nó làm cho mọi thứ rõ ràng hơn. Trong trường hợp này, nói get_data
là một con trỏ tới một hàm thậm chí còn vô nghĩa vì phần tiếp theo là phần thân hàm. Để tham khảo:
int (*get_data)(int num_grades);
Đây là nơi con trỏ tới một khai báo hàm nhận một int
tham số và trả về một int
trông giống như. Và không thể có một cơ quan chức năng đằng sau nó.
Tôi là một lập trình viên xuất sắc, rất giỏi!