【笔记】数组和指针作为参数

首先应该明白两点:
1、C语言中,一维数组做参数时,编译器总是把它解析成一个指向数组首元素首地址的指针
2、所有非数组形式的数据实参均以传值的形式调用。(对实参做一份备份并传递给函数,函数不能修改实参本身,只能修改传给它的拿份备份)

一、数组作为参数

下面举一些例子:

void fun(char a[10])
{
	char c = a[3];
}

int main(void)
{
	char b[10] = "asdfg";
	fun(b[10]);
	return 0;
}

分析上面例子的错误:
1.fun(b[10]),出错,数组的范围是0-9,所有b[10]越界,不过这不是讨论重点
2.还是这一句,b[10]传进去的是什么?是一个值,它是char类型的,而函数接受的是char *类型
所以说,不能向函数传递一个数组,即使是fun(b),这样写,传进去的也是数组b首元素的首地址而已。如下,sizeof求出的长度为4,而不是10.

fun(b);
void fun(char a[10])
{
	int i = sizeof(a);
}

所以,函数中,参数为数组还是这么写好了:

fun(char *)fun(char a[])

二、指针作为参数

直接上例子:

void fun(char *p)
{
	p = (char *)malloc(100);
}

int main(void)
{
	char * str = NULL;
	fun(str);
	strcpy(str,"hello");
	free(str);  //没有起作用,内存泄漏

	return 0;
}

内存泄漏是因为,str并没有分配到内存。所以载strcpy(str,“hello”)这里就出错了,可以看到str的值仍然是NULL。

上述例子说明,str作为参数传进去,不算它本身,而是它的备份。所以才没有成功分配内存。

要解决这个问题,可以用:
1、用return

char* fun(char *p)
{
	p = (char*)malloc(100);
	return p;
}

2、用二级指针

void fun(char **p)
{
	*p = (char *)malloc(100);
}

int main(void)
{
	char * str = NULL;
	fun(&str);
	free(str);
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值