【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的值未被修改。

你可能感兴趣的:(c语言)