#include <stdio.h>
#include <stdlib.h>
void input(int **ar, int *n) {
printf("Number of elements: ");
scanf("%d", n);
*ar = (int*)malloc(*n * sizeof(int));
//*ar = new int[*n];
for (int i = 0; i < *n; ++i){
printf("Element %d:", i);
scanf("%d", &(*ar)[i]);
}
return;
}
void output(int *ar, int n) {
for (int i = 0; i < n; ++i) {
printf("%5d\n", ar[i]);
}
return;
}
int main() {
int n = 0;
int *ar = NULL;
input(&ar, &n);
output(ar, n);
free(ar);
return 0;
}所以我刚刚在我的大学里学到了C的指针。例如,我不明白为什么input函数中的input是一个int**而不是一个int*。我的意思是,我尝试用int* ar替换int* ar,并在main函数中删除int* ar = NULL中的*,并且没有编译错误。当我运行这个程序时,一切都很好。我输入元素的数量并在这些元素中输入一些值,但是,当我在最后一个元素中输入最后一个数字时,我将一无所获。所以我取消了一切,程序又正常工作了。
发布于 2022-03-12 05:36:23
您发布的程序如下所示(如下所示):
。
让你困惑的部分是2。
我不明白为什么输入函数中的ar是int**而不是int* .
如果您想将内存分配给指针(或者想要更改指针,例如,让它指向其他内存或重新分配内存等等)。在其他函数中,您需要访问该函数中的指针,如果您有该指针的地址,则可以访问该指针。
这就是为什么在这里传递ar指针的地址:
input(&ar, &n);将ar的地址传递给input()函数,在输入函数取消引用中,该地址(即*ar)将给出ar指针(在main()中声明/定义)。
为了更好地理解,我将input()函数的input()参数重命名为input_ar。
void input(int *input_ar, int *n) {
.....
.....当input()函数从main()函数调用时,内存中的视图将如下所示:
input_ar ar
+-----+ +-----+
| 200 | ----> | NULL|
+-----+ +-----+
[200 is address of ar pointer]在input()函数中,当您这样做时:
*input_ar = (int*)malloc(*n * sizeof(int));取消引用input_ar (即*input_ar)将给ar
input_ar *input_ar (ar) (newly allocated memory block)
+-----+ +-----+ +-----+
| 200 | ---------> | 300 | ----> | |
+-----+ +-----+ +-----+
[300 is address of the newly allocated memory block]因此,通过取消input_ar,可以在input()中更改指针ar。
,我的意思是,我尝试用int* ar替换int** ar,删除主函数中的* int* ar = NULL,并且没有编译错误。
注意,如果从*中的ar声明中删除main(),那么ar将是一个int类型的变量,这意味着它将不是一个指针,而是一个可以容纳int类型值的变量。如果您在程序中进行此更改,则必须在其他地方进行更改,例如,您在input()函数中接受用户输入的方式,以及output()函数的相应更改等。
您还没有显示在从*声明中删除ar之后所做的更改的程序,因此,我将只讨论传递给input()的ar参数。
这就是你可能尝试过的:
int ar;
input (&ar, &n);在input()中
void input(int *ar, int *n) {
printf("Number of elements: ");
scanf("%d", n);
ar = (int*)malloc(*n * sizeof(int));
.....注意,ar指针参数是input()函数的局部变量。当input()函数从main()函数调用时,ar将保存main()函数的ar变量的地址。如果需要,可以使用ar函数中的指针ar更改input()变量的值,例如- *ar = 9; -这将将值9赋给变量ar (of main())。内存中的视图应该如下所示
ar (of input()) ar (of main())
+-----+ +-----+
| 200 | -------------> | |
+-----+ +-----+
[200 is address of ar variable of main()]但当你做的时候
ar = (int*)malloc(*n * sizeof(int));ar丢失了main()函数的ar变量的地址,新分配的内存引用被分配给input()的指针ar。
ar (of input()) newly allocated memory block
+-----+ +-----+
| 400 | -------------> | |
+-----+ +-----+
[400 is address of the newly allocated memory block]您可以写入/修改这个内存中的内容,但是当从input()返回时,由于input()没有返回任何内容,这个内存引用将丢失,这将是程序中的内存泄漏。
发布于 2022-03-12 03:10:04
在这里使用指针的一个常见用法是允许函数调用更改一个变量的值。
例如,假设您有以下内容:
void
change_num(int num)
{
num = 6;
}
int
main()
{
int num = 5;
change_num(num);
printf("%i\n", num);
return 0;
}这不起作用,因为change_num正在更改自己的副本 of num,而不是num本身。
相反,您必须将指向num的指针传递给函数:
void
change_num(int* num_ptr)
{
*num_ptr = 6;
}
int
main()
{
int num = 5;
change_num(&num);
printf("%i\n", num);
return 0;
}*num_ptr = 6;行的意思是“将num_ptr指向的对象更改为6”。
在一般情况下,如果我们希望一个函数更改SomeType类型变量的值,那么我们必须将一个SomeType*传递给该函数。
在您的示例中,您希望更改ar的值,它是一个int*。现在,它不保存任何东西的地址(NULL),您希望将其更改为保存已分配数组的值(由malloc创建)。如果我们将int*传递给函数以更改int,而传递SomeType*以更改SomeType,则必须传递int**以更改int*。
https://stackoverflow.com/questions/71446627
复制相似问题