您的位置:首页 > 其它

如何使用指针去申请内存

2017-03-26 19:20 176 查看
            版权所有,
如何使用指针去申请内存

 

voidGetMemory(char *p, int num)
{
p = (char*)malloc(sizeof(char) * num);
}

void test(void)
{
char *str = NULL;
GetMemory(str, 100);
strcpy(str,"hello");
}


以上就是错误的使用指针去申请内存的方法
 我们来好好解释一下指针 
     str有一个属于自己的存储地址,就像 int a=0;一样 a也有一个属于自己的地址
      str中存放的一个值,这个值有特殊的含义, 
a中也存放这一个值,现在这个值为0;
      str = &a;  
现在可以看出str内存放的值的特殊了,是存放的地址。
 总结起来 

指针和变量一样,也是有地址的,只不过变量的值被解释成一个值,而指针的值被解释成一个地址。
      str = xx;   是操作str自己地址内存放的值;
      *str = xx; 是操作str存放的 地址所对应的区域的值。

当给一个函数的参数传递一个变量是,这个变量是复制过去的
回到上面的代码,GetMemory(str, 100);传入的是str的值,即str存放的地址,简单点说就是
 *p = str;到这里为止,不管GetMemory(str,
100);中怎么操作,都和str没有半点关系,
换个角度,我们这个函数的用意是改变str中存放的地址值,而这个函数GetMemory(str,
100);
只是将str的值传入。
我们要在调用的函数内改变str的值应该传入的是 str的地址,即 &str,操作这个地址就可以改值。
所以GetMemory(str, 100);应该写作GetMemory(&str, 100);

 
那么GetMemory(x,x);应该怎么写呢。
我现在也无法深入的解释,编译器(vs 2012)提示我要类型匹配,否则就报错。
 &str对应的类型就
char **。所以应该定义为GetMemory(char **p,x);

 
接下来我们讲一讲指针的指针
  
char i=5,j=6;
char *ip1= &i; char *ip2 = &j;  char **p=&ip1;


 

 
接下来如果这样写
  *p = ip2;
结果会怎么样??
要弄懂上面的问题我们要先搞清楚*p
和 ip2表示什么
 经过这条语句char
**p=&ip1; p的值就是ip1的地址。
 所以*p表示的就是ip1的值&i,
  *p = ip2; 
表达的意思就是将ip2的值&j赋值给ip1;最后的结果就是ip1是等于&j,即改变了ip1的指向。

由于指针的指针难以理解,可以使用函数的返回值来实现
char *GetMemory(int n)
{
char *p = (char *)malloc(sizeof(char)*n);
return p;
}

void main()
{
char *str = NULL;
str = GetMemory(100);
strcpy(str, "hello");
free(str);
return 0;
}返回指针的函数即可以实现这个功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息