【C语言学习笔记】


前言

在学习C语言的过程中,遇到了一道2003计算机二级考题,考察了指针的使用。特此记录下来。


一、题目

以下程序段中,能够通过调用函数fun,使main函数中的指针变量p指向一个合法的整型单元的是()。

A) main()
{
	int*p;
	fun(p);
}
int fun(int *p)
{
	int s;
	p=&s;
}

B) main()
{
	int *p;
	fun(&p);
}
int fun(int **p)
{
	int s;
	*p = &s;
}

C) #include 
	main()
{
	int *p;
	fun(&p);
}
int fun(int **p)
{
	*p = (int *) malloc(2);
}

D) #include
	main()
{
	int *p;
	fun(p);
}

int fun(int *p)
{
p = (int *)malloc(sizeof(int));
}

二、解答

首先明白形参与实参的概念。

  • 实参(实际参数)
    函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参
    形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。

  • 形参(形式参数)
    在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。程序调用结束后,分配给形参的内存会被收回,形参的值也随之不复存在。

其次要知道,函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。

下面是这道题的解答:
A) ✘
从主函数开始,main()中声明了一个指向int类型的指针变量p,接着调用fun§,这里p是实参;再看fun(int *p),注意这里p是形参,在内存中和实参p不在同一个地址(可以理解为刚刚好有两个同名的人,但是他们住的地址并不一样由此可以将他们区分开来,所以并不能说他们两是同一个人)。因为p是形参,所以p也可以是任意其他的变量名,为了方便理解不混淆,我们姑且把p换成a(下同)。那么接下来main()中调用fun§的操作如下:
1.赋值 a = (实参)p ;
2. int s;
3. a = &s ;
调用结束后,形参的内存被收回,a的值也不复存在。
fun§也未对p的值进行改变,p指向一个未知的地址,非法!

B) ✘
声明一个指向int类型的指针变量p;
1.int *p
2.调用fun(),传入实参&p;
3.传入参数后,实参的值会被赋给形参 : *a = &p ;
4. int s;
5. *a = &s ;
结果同样是p指向了一个未知的地址。

C) ✔
1.int *p
2.调用fun(),传入实参&p;
3.声明a是一个指向int类型指针的指针变量: int **a;
4.赋值 a = &p ;
5.*a 表示访问a所指向的地址,所以 *a = p;
6.p = (int *) malloc(2);malloc()返回的是一个void *类型的指针,强制转换为int *类型
所以p指向了一个合法的整型单元。

D)✘
1.int *p
2.调用fun(),传入实参&p;
3.赋值a = p;
4.a =(int *)malloc(sizeof(int));
5.调用结束,a的内存回收。p的值未被修改。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值