C - 指针的正确语法
C - proper syntax for pointer
我调用一个函数全局变量如下:
char *Pointer;
然后我将它传递给函数:
char *MyChar = DoSomething (&Pointer);
定义为:
char *DoSomething (char *Destination)
{
free (*Destination);
//re-allocate memory
Destination = malloc (some number);
//then do something...
//finally
return Destination;
}
它仅在我使用 (*Destination) 而不是 (Destination) 时有效。有人可以告诉我这是否正确吗?我仍然不明白为什么它不带 (Destination)。
是对的,Destination
已经声明为指针了,所以你把Destination
的地址传给DoSomething(&Destination)
,就是指针指向指针,那么你需要在 DoSomething()
函数中取消引用 Destination
,间接运算符 *
对其起作用。
但正确的方法,不是传递指针的地址,而是传递指针,如
DoSomething(Destination);
现在,既然你想在函数内部 malloc Destination
,你应该这样做
char * DoSomething( char **Destination )
{
// free( Destination ); why?
//re-allocate memory
*Destination = malloc( some number );
//then do something...
//finally
return *Destination;
}
这是如何使用指针的演示
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *copyString(const char *const source)
{
char *result;
int length;
length = strlen(source);
result = malloc(length + 1);
if (result == NULL)
return NULL;
strcpy(result, source);
printf("The address of result is : %p\n", result);
printf("The content of result is : %s\n", result);
printf("The first character of result is @ %p\n", &result[0]);
return result;
}
int main()
{
char *string = copyString("This is an example");
printf("\n");
printf("The address of string is : %p\n", string);
printf("The content of string is : %s\n", string);
printf("The first character of string is @ %p\n", &string[0]);
/* we used string for the previous demonstration, now we can free it */
free(string);
return 0;
}
如果执行前面的程序,会发现指针都指向同一块内存,内存中的内容也是一样的,所以在main()
中调用free
会释放记忆。
这是正确的做法
char *Pointer;
//,,, maybe allocating memory and assigning its address to Pointer
//... though it is not necessary because it is a global variable and
//... will be initialized by zero. So you may apply function free to the pointer.
char *MyChar = DoSomething( Pointer );
char * DoSomething( char *Destination )
{
free( Destination );
//re-allocate memory
Destination = malloc( some number );
//then do something...
//finally
return Destination;
}
至于你的代码那么
参数类型与函数调用中的参数类型不对应
char *MyChar = DoSomething (&Pointer);
参数的类型是 char *
( char *Destination ) 而参数的类型是
char **
( &指针 )
由于 Destination 是指针,因此
免费(*目的地);
你必须写
free( Destination );
这是因为你在行
中传递了指针 char *Pointer
的地址
char *MyChar = DoSomething (&Pointer);
由于您在函数中传递了指针的地址 DoSomething
它会将函数范围变量 Destination
视为指向地址的指针,该地址是指针的地址 Pointer
.
所以不要用
传递Pointer
的地址
char *MyChar = DoSomething(&Pointer);
你需要像这样传入指针本身:
char *MyChar = DoSomething(Pointer);
这将允许您使用
free(Destination);
注意缺少 &
表示 Pointer
的地址。
我调用一个函数全局变量如下:
char *Pointer;
然后我将它传递给函数:
char *MyChar = DoSomething (&Pointer);
定义为:
char *DoSomething (char *Destination)
{
free (*Destination);
//re-allocate memory
Destination = malloc (some number);
//then do something...
//finally
return Destination;
}
它仅在我使用 (*Destination) 而不是 (Destination) 时有效。有人可以告诉我这是否正确吗?我仍然不明白为什么它不带 (Destination)。
是对的,Destination
已经声明为指针了,所以你把Destination
的地址传给DoSomething(&Destination)
,就是指针指向指针,那么你需要在 DoSomething()
函数中取消引用 Destination
,间接运算符 *
对其起作用。
但正确的方法,不是传递指针的地址,而是传递指针,如
DoSomething(Destination);
现在,既然你想在函数内部 malloc Destination
,你应该这样做
char * DoSomething( char **Destination )
{
// free( Destination ); why?
//re-allocate memory
*Destination = malloc( some number );
//then do something...
//finally
return *Destination;
}
这是如何使用指针的演示
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *copyString(const char *const source)
{
char *result;
int length;
length = strlen(source);
result = malloc(length + 1);
if (result == NULL)
return NULL;
strcpy(result, source);
printf("The address of result is : %p\n", result);
printf("The content of result is : %s\n", result);
printf("The first character of result is @ %p\n", &result[0]);
return result;
}
int main()
{
char *string = copyString("This is an example");
printf("\n");
printf("The address of string is : %p\n", string);
printf("The content of string is : %s\n", string);
printf("The first character of string is @ %p\n", &string[0]);
/* we used string for the previous demonstration, now we can free it */
free(string);
return 0;
}
如果执行前面的程序,会发现指针都指向同一块内存,内存中的内容也是一样的,所以在main()
中调用free
会释放记忆。
这是正确的做法
char *Pointer;
//,,, maybe allocating memory and assigning its address to Pointer
//... though it is not necessary because it is a global variable and
//... will be initialized by zero. So you may apply function free to the pointer.
char *MyChar = DoSomething( Pointer );
char * DoSomething( char *Destination )
{
free( Destination );
//re-allocate memory
Destination = malloc( some number );
//then do something...
//finally
return Destination;
}
至于你的代码那么
参数类型与函数调用中的参数类型不对应
char *MyChar = DoSomething (&Pointer);
参数的类型是 char *
( char *Destination ) 而参数的类型是
char **
( &指针 )
由于 Destination 是指针,因此
免费(*目的地);
你必须写
free( Destination );
这是因为你在行
中传递了指针char *Pointer
的地址
char *MyChar = DoSomething (&Pointer);
由于您在函数中传递了指针的地址 DoSomething
它会将函数范围变量 Destination
视为指向地址的指针,该地址是指针的地址 Pointer
.
所以不要用
传递Pointer
的地址
char *MyChar = DoSomething(&Pointer);
你需要像这样传入指针本身:
char *MyChar = DoSomething(Pointer);
这将允许您使用
free(Destination);
注意缺少 &
表示 Pointer
的地址。