指针、结构、传递参数、递归

Pointers, structure, passing arguments, recursion

我有这样的代码:

typedef struct _Statistics {

  Some code here

} Statistics;

void function1(char *string, Statistics *statistic){

   Some code here

   function1(string1, statistic);
}
int main(){

   Statistics statistic;
   function1(string, &statistic);
}

这可能是个愚蠢的问题,但我不完全理解指针: 我明白为什么我在main函数中使用&,&发送变量统计地址,以便在function1中我可以修改它。但是为什么我不在递归函数1中使用&?

因为&statistic(在function1()中)是指针的内存地址,而不是指针所包含的地址。

&statistic的类型是function1()中的Statistics**


关于指针的几句话

假设我们定义了以下变量:

char c = 'a';
char *p_c = &c;

现在,我们将打印p_cc的值和内存地址:

printf("%c\n", c); // will print 'a'
printf("%c\n", *p_c); // will print 'a' 

printf("%p\n", &c); // will print the memory address of c
printf("%p\n", p_c); // will print the memory address of c

printf("%p\n", &p_c); // will print the memory address of p_c

最后我们定义一个char**,一个指向char的指针:

char **p_pc = &p_c;

printf("%c\n", **p_pc); // will print 'a'
printf("%p\n", *p_c); // will print the memory address of c
printf("%p\n", p_c); // will print the memory address of p_c

有时这样写会有帮助:

void function1(char* string, Statistics* statistic){

变量statistic是一个指向统计信息的指针,而不是统计信息本身。如果您在函数 1 中这样做:

   function1(string1, &statistic);

您将传递一个指向(由于 & 的指针)指向(由于声明中的 *)统计信息的指针,这是不正确的。

您在 main as Statistic 中声明的 statistic 增加了混乱:您在两个作用域中使用了具有不同类型的相同变量名。

使用不同的变量名更清楚:

typedef struct _Statistics {
  Some code here
} Statistics;

void function1(char* string, Statistics* ptrstat){
   Some code here
   function1(string1, ptrstat);
}

int main(){
   Statistics statistic;
   function1(string, &statistic);
}

通常(即大多数语言),您可以按值传递或按引用传递。这将取决于函数的定义及其 'signature';即它及其参数的声明方式。

传值就像一个赋值,如果复制一个更大的结构,它会花费更长的时间。此外,该函数只接收一个副本,因此您可以更改函数中的参数,但这只会影响函数的本地副本(参数)并且不会更改原始值(在调用者中)传给你了。

相比之下,按引用传递只是传递原始值的指针(内存中的地址)。这要快得多(4 或 8 个字节),但它确实意味着该函数不仅可以读取而且可以 写入 调用者的值。有时你想要这个!有时你不会。

在你的主里,你有统计的价值。您调用的函数需要地址 (*),因此您需要传递其地址 (&statistic) 而不是传递值 (statistic)。

在调用自身的函数中,您有一个指向统计信息 (Statistics *) 的指针,您必须传递一个指向统计信息 (Statistics *) 的指针:因此,只需传递它,即指针 'statistic'。