C语言深度解剖(精讲版)——读书笔记21 &&自己的一些理解

第4章 指针和数组

一.一级指针参数

1.能否把指针变量本身传给一个函数

例:

void fun(char *p)

{

char c= p[3];

}

int main()

{

char *p2= "abcdefg";

fun(p2);

retrun 0;

}

这个函数调用真的把p2本身传递到了fun函数内部吗?

解析:p2是main函数内的一个局部变量,它只在main函数内部有效。既然它是内部函数,fun函数肯定无法使用p2的真身。那函数调用怎么办?好办:对实参做一份备份并传递给被调用函数,即对p2做一份备份,假设其设备名为_p2,那么传递到函数内部的就是_p2而非p2本身。

2.无法把指针变量本身传递给一个函数

fun函数实际运行时,用到的都是_p2这个变量而非p2本身。

void GetMemory(char *p ,int num)

{

p = (char *) malloc(num *sizeof(char));

}

int main()

{

char *str =NULL;

GetMemory(str ,10);

strcpy(str, "hello");

free(str);

return 0;

}

在运行strcpy(str, "hello")语句的时候发生错误。这时候观察str的值,发现仍然为NULL.也就是说str本身并没有改变,我们malloc的内存的地址并没有赋给str,而是赋给了_str。而这个_str是编译器自动分配和回收的,我们根本就无法使用,所以想这样获取一块内存是不行的。

2个解决办法:

(1).用retrun

void GetMemory(char *p ,int num)

{

p = (char *) malloc(num *sizeof(char));

return p;

}

int main()

{

char *str =NULL;

GetMemory(str ,10);

strcpy(str, "hello");

free(str);

return 0;

}

(2)用二级指针

void GetMemory(char *p ,int num)

{

p = (char *) malloc(num *sizeof(char));

}

int main()

{

char *str =NULL;

GetMemory(&str ,10);

strcpy(str, "hello");

free(str);

return 0;

}

注意,这里的参数是&str而非str,这样的话传递过去的是str的地址,是一个值。在函数内部,用钥匙(“*”)来开锁:*(&str)其值就是str。所以malloc分配的内存地址是真正赋值给了str本身。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值