【发布时间】:2015-02-16 13:11:26
【问题描述】:
花了很长时间使这段代码工作之后,有人可以向我解释为什么当我将指向字符串的指针作为参数传递给函数时需要 2 星吗? 根据定义,指针将地址保存到将放置某个变量的内存中。所以它是一个有自己地址的变量,在这个地址下是另一个变量的地址。好的。因此,如果我将指针传递给函数,我会使用 & 符号,因为我必须将指针地址传递给函数。美好的。 但接下来会发生什么。该函数接收该指针在内存中的位置信息。好的。这是我的理解。我不明白为什么在定义函数及其参数时需要两颗星。我正在传递一个指向 char 变量的指针。为什么不 void wpisuj(char * w)。为什么是 wpisuj(char** w)。 内存分配对我来说是可以理解的——我用 malloc 保留了内存,而 malloc 返回了这个内存的地址,所以我把这个地址作为变量 w 的值。 还有一些我不明白的事情,如果 *w 是指针并将新创建的位置的地址保存在内存中,为什么我使用 *w 在那里放置一个字符串。不应该是 *(*w) 吗?由于 *w 是保留内存的地址,那么 *(*w) 就是这块内存的内容。
总结。我不明白的是: 1) 为什么 wpisuj (char **w) 而不是 wpisuj (char *w) 2) 为什么 strcpy(w, bufor) 而不是 strcpy((*w), bufor)
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
# define SIZE 256
void wpisuj(char** pw){
char bufor[256];
scanf("%s", bufor);
int l;
l=strlen(bufor)+1;
*pw=(char*)malloc(l*sizeof(char));
strcpy(*pw, bufor);
}
int main(){
char* w;
wpisuj(&w);
printf("%s", w);
return 0;
}
如果我还可以询问有关释放内存的问题。我认为这是正确的星星数量是否正确(如下面的代码所示):
void free_memory(char **w){
free(*w);
}
但是,如果我在 main() 中释放内存,我会:
int main(){
w=malloc(sizeof(buffer)+sizeof(char));
/* some code before */
free(w);
}
【问题讨论】:
-
两颗星,因为它是一个指向指针的指针......
-
*= 指针。**= 指向指针的指针。就是这样 -
如果在函数中使用不同的变量名会有所帮助。函数的
w是指向main 的w的指针。也许称它为pw。那么函数中的*pw与main中的w表示同一个变量。 -
谢谢你,Matt - 是的,在函数中更改变量的名称是个好主意,让我更容易理解。