2021-06-21 C语言指针与数组(续1)

能否向函数传递一个数组?

void fun(char a[10])
{
char c = a[3];
}
intmain()
{
char b[10] = “abcdefg”;
fun(b[10]);
return 0;
}

函数参数需要的是一个char*类型的参数,而实际参数为char 类型,不匹配。

第一:b[10]并不存在,在编译的时候由于没有去实际地址取值,所以没有出错,但是
在运行时,将计算b[10]的实际地址,并且取值。这时候发生越界错误。
第二:编译器的警告已经告诉我们编译器需要的是一个char*类型的参数,而传递过去
的是一个char 类型的参数,这时候fun 函数会将传入的char 类型的数据当地址处理,同样
会发生错误。

无法向函数传递一个数组

C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。

在C 语言中,所有非数组形式的数据实参均以传值形式(对实参做一份拷贝并传递给被调用的函数,函数不能修改作为实参的实际变量的值,而只能修改传递给它的那份拷贝)调用。然而,如果要拷贝整个数组,无论在空间上还是在时间上,其开销都是非常大的。更重要的是,在绝大部分情况下,你其实并不需要整个数组的拷贝,
你只想告诉函数在那一刻对哪个特定的数组感兴趣。这样的话,为了节省时间和空间,提高程序运行的效率,于是就有了上述的规则。同样的,函数的返回值也不能是一个数组,而只能是指针。这里要明确的一个概念就是:函数本身是没有类型的,只有函数的返回值才有类型。

void fun(char *p)
{
char c = p[3];//或者是char c = *(p+3);
}
intmain()
{
char b[100] = “abcdefg”;
fun(b);
return 0;
}
void fun(char a[ ])
{
char c = a[3];
}

这里的函数的数组参理解为编译器将数组解析为一个指向其首元素地址的指针。

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

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

void GetMemory(char * p, int num)
{
p = (char *)malloc(num*sizeof(char));
}
intmain()
{
char *str = NULL;
GetMemory(str,10;
strcpy(str,”hello”);
free(str);//free 并没有起作用,内存泄漏
return 0;
}

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

char * GetMemory(char * p, int num)
{
p = (char *)malloc(num*sizeof(char));
return p;
}
intmain()
{
char *str = NULL;
str = GetMemory(str,10;
strcpy(str,”hello”);
free(str);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值