精华内容
下载资源
问答
  • 形参 实参 指针

    2020-04-26 23:43:32
    在学习C语言过程中,大多浅尝辄止,点到为止,所以当有人问起你C语言怎么样,你会尬笑一下,说一句没有底气话:“”“还行吧”,为了更深入学习,今天开始记录一些知识点

    形参 实参 指针

    形参 实参
    在学习C语言的过程中,大多浅尝辄止,点到为止,所以当有人问起你C语言怎么样,你会尬笑一下,说一句没有底气的话:“”“还行吧”,为了更深入的学习,今天开始记录一些知识点。

    直接上代码

    #include<stdio.h>
    #pragma warning(disable: 4996)
    int main()
    {
    	void swap(int,int);
    	int x,y;
    	printf("please input 2 numbers:\n");
    	scanf("%d %d",&x,&y);
    	swap(x,y);
    	printf("changed two number is %d,%d\n",x,y);
    	return 0;
    }
    /*
    这里有值得注意的点:
    当实参x y 代入swap函数去做计算的时候,并不是把x y本身代入了进去,只是将变量x对应的值赋给了形参a,将变量y对应的值赋给了形参b
    x,y变量的值依然存在。“实参变量和形参变量中的数据传递是单向的”
    这也就说明如果swap函数中没有printf函数时,在调用之后,主函数去输出x,y两个值并没有交换,因为实参和形参的赋值过程只是将实参的值做了传递
    自定义函数中的确做了数值的交换,只不过交换的是形参的值,和主函数中的实参没有关系
    */
    void swap(int a,int b)
    {
    	int temp;
    	temp = a;
    	a = b;
    	b = temp;
    	printf("changed two number is %d,%d\n",a,b);//a
    }
    

    指针
    指针是C语言的精华,什么是指针?什么是指针变量?指针简单来说就是一个变量的存放地址,指针变量首先是一个变量,它是专门用来存放地址的变量类型。在定义一个指针变量的时候,用*号来表明该变量是个指针变量,其次必须要指定类型,也就是说这个指针变量是用来存放哪种数据类型的,因为数据在存放时,系统分配的大小是不同的,比如int型分配4个字节,char型分配一个字节。
    先贴代码:

    #include<stdio.h>
    #pragma warning(disable:4996)
    //实现:输入两个整数,按大小顺序输出
    int main()
    {
    	void swap(int *p1,int *p2);
    	int a,b;
    	int *pointer_1,*pointer_2;
    	printf("please enter a and b:\n");
    	scanf("%d,%d",&a,&b);
    	pointer_1 = &a;
    	pointer_2 = &b;
    	if(a < b)
    		swap(pointer_1,pointer_2);
    	printf("max = %d\nmin = %d\n",a,b);
    	return 0;
    }
    
    void swap(int *p1,int *p2)
    {
    	int temp;
    	temp = *p1;
    	*p1 = *p2;
    	*p2 = temp;
    }
    

    上面这段代码利用指针类型的数据作为函数参数实现了对整数大小判断并按顺序输出,值得注意的地方是,在swap函数声明参数时的※号是表明p1是一个指针变量,而在运算过程中temp = *p1;这里的※号有实际意义的,就是取指针变量p1指向的值。
    首先分析下将a,b的地址分别赋值给了指针变量pointer_1和pointer_2,也就是说指针变量pointer_1指向a,指针变量pointer_2指向b,可以用下图1来理解:
    图1
    然后在判断之后,将实参变量传递给了形参变量调用函数,这样指针变量p1和p2又分别指向了a,b,也就是说a和b的地址都存在了两个变量中,通过任意一个对应的指针变量都可以找到,可以用下图2来理解:
    图2
    在函数调用之后,两个指针变量的值通过中间变量temp做了互换,也就是地址没有变,只是地址上的数值变了,相当于两个客房的住户调换了房间,但是门牌号没有变化。在函数调用结束之后,两个形参的内存被释放,则就不存在这两个指针变量,a和b的地址只有惟一的存放变量,可以用下图3来理解:
    图3
    在形参释放之后,可以理解为下图4:
    图4
    这样就通过指针完成了两个数值的交换,可以通过下面的代码对比理解。只改变了调用函数的内容。

    #include<stdio.h>
    #pragma warning(disable:4996)
    int main()
    {
    	void swap(int *p1,int *p2);
    	int a,b;
    	int *pointer_1,*pointer_2;
    	printf("please enter a and b:\n");
    	scanf("%d,%d",&a,&b);
    	pointer_1 = &a;
    	pointer_2 = &b;
    	if(a < b)
    		swap(pointer_1,pointer_2);
    	printf("max = %d\nmin = %d\n",a,b);
    	return 0;
    }
    
    void swap(int *p1,int *p2)
    {
    	int *temp;
    	temp = p1;
    	p1 = p2;
    	p2 = temp;
    }
    

    这里的swap函数中,交换了p1和p2的地址,而不是交换了变量值,关键是是做形参做了处理,但是没有输出形参的结果就释放掉了,可以理解为下图5:
    图5
    这样在形参消失后,对main函数的输出是没有影响的,或者可以不在main函数中输出,可以在swap中增加输出函数如:

    void swap(int *p1,int *p2)
    {
    	int *temp;
    	temp = p1;
    	p1 = p2;
    	p2 = temp;
    	printf("max = %d\nmin = %d\n",*p1,*p2);
    }
    

    这里的笔记是在学习了谭浩强C程序设计之后做的总结。

    展开全文
  • 前言:刚学习C语言的时候,基础没打扎实,落下了大大小小的漏洞,因此对一些自己曾经记错的知识点分享给大家。 1.对于传参的理解 void f(int b){ b=b/2; return b; } int main(){ int a=0; scanf("%d",&a)...
    1. 前言:刚学习C语言的时候,基础没打扎实,落下了大大小小的漏洞,因此对一些自己曾经记错的知识点分享给大家。
      1.对于传参的理解
    void f(int b){
          b=b/2;
          return b;
          }
    int main(){
    	int a=0;
    	scanf("%d",&a);
    	printf("%d",f(a));
    	printf("%d",a);
    	return 0;
    }
    
    1. 分析:在main函数里面定义的实参a,虽然传到了函数f()里面被运用,
      但是形参int b并不会改变实参a的值;
      只是实参a的值在调用函数f()的时候把a的值赋值给了b,以此代替a进行函数f()里面的运算。
      注意,实参与形参的名称不要一致。在main里面定义了int a,int f()的()就不要定义int a了。
    #include <stdio.h>
    	int math(char *p){
    		if(*p=='\0'){
    		return 0;
    	}else{
    		return 1+math(p+1);
    	}
    	}
    	int main(){
    		char a[1024];
    		scanf("%[^\n]",a);
    		printf("%d",math(a));	
    		return 0;
    }
    
    1. 分析:scanf("%[\n]",a);中%[\n]的意思是,当输入的遇到\n即回车时,表示输入结束,math(a)中调用函数时将实参字符型数组a传进去,另一边使用字符指针*p指向字符数组a的首元素, 然后return 1+math(p+1);中p+1就是指针p指向下一个元素。
      注意:指针值的改变会影响所代表的数组的元素
    展开全文
  • 一、下面这个函数虽然是合法,但是不算特别有用。指出它局限性并设法改善。 bool is_empty(string& s) { retrun s.empty();} 解析:字符串s在函数中无需修改,所以最好是加上const 表示常量引用。 将...

    一、下面的这个函数虽然是合法的,但是不算特别有用。指出它的局限性并设法改善。

        bool is_empty(string& s) { retrun s.empty();}
        解析:字符串s在函数中无需修改,所以最好是加上const 表示常量引用。
        将程序变为:bool is_empty(const string& s) { retrun s.empty();}
    

    二、编写一个函数,判断string对象是否含有大写字母。编写另一个函数,把string对象全都改写为小写形式。在这两个函数中使用的形参类型相同吗?为什么?

         (1)判断大写字母
    					#include <iostream>
    					#include <string>
    					#include <vector>
    					using namespace std;
    					bool My_reset(string const &My_string)//函数的声明及定义,My_string无需在函数中修改,所以使用常量引用。
    					{
    						for (unsigned int i = 0; i < My_string.size(); i++)
    						{
    							if (My_string[i] >= 'A' && My_string[i] <= 'Z')//利用ASCII码进行判断
    							{
    								return true;
    							}
    						}
    						return false;//返回目标字符出现的首位置
    					}
    					int main()
    					{
    						cout << "请输入目标字符串:";
    						string string_1;
    						cin >> string_1;
    						if (My_reset(string_1))
    						{
    							cout << "目标字符串中含有大写字母" << endl;
    						}
    						else
    						{
    							cout << "目标字符串中不含有大写字母" << endl;
    						}
    					}
    	(2)判断大写字母,然后进行修改为小写字母
    	
    				    #include <iostream>
    					#include <string>
    					#include <vector>
    					using namespace std;
    					
    					string My_reset(string &My_string)//函数的声明及定义,My_string需在函数中修改,所以不能使用常量引用。
    					{
    						for (unsigned int i = 0; i < My_string.size(); i++)
    						{
    							if (My_string[i] >= 'A' && My_string[i] <= 'Z')
    							{
    								My_string[i] = My_string[i] + 32;//大写字母小写字母的ASCII码:注意大小写字母之间的相互转换
    							}
    						}
    						return My_string;//返回修改后的字符串
    					
    					}
    					int main()
    					{
    						cout << "请输入目标字符串:";
    						string string_1;
    						cin >> string_1;
    						cout << "修改前的字符串为" << string_1 << endl;
    						cout << "修改后的字符串为" << My_reset(string_1) << endl;
    					}
    解析:需要注意我们要谨记一点:修改传入的参数,就不能用常量引用。
    

    三、为下面的函数编写函数声明,从给定的名字中推测函数具备的功能。

       (a)名为compare的函数,返回布尔值,两个参数都是matrix类的引用。
            解析:bool compare(matrix &m1, matrix &m2){ /.../ }
            
       (b)名为change_val的函数,返回vector<int>的迭代器,又两个参数:一个是int,另一个是vector<int>的迭代器。
           解析:vector<int>::iterator change_val(int, vector<int>::iterator) { /.../ }
    

    四、引用形参什么时候应该是常量引用?如果形参是常量引用,而我们将其设为普通引用,会发生什么情况?

       解析:无需在函数中改变的参数应该为常量引用,普通情况下,可能不会出错,但是有些不小心改变了不应该改变的参数就会引发不必要的错误。
    
    展开全文
  • 形参实参的区别: 主体不同 实参:在调用有参函数时,函数名后面括号中的参数为“实际参数”。 形参:不是实际存在变量,又称虚拟变量。 目的不同 实参:可以是常量、变量或表达式, 无论实参是何...

    形参和实参的区别:

     

    主体不同

     

    1. 实参:在调用有参函数时,函数名后面括号中的参数为“实际参数”。
    2. 形参:不是实际存在变量,又称虚拟变量。

     

     

     

    目的不同

     

    1. 实参:可以是常量、变量或表达式, 无论实参是何种类型的量,在进行函数调用时,都必须具有确定的值, 以便把这些值传送给形参。 
    2. 形参:定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。

     

    特点不同

     

    1. 实参:在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。该值在函数调用期间有效,可以参加该函数中的运算。
    2. 形参:形参的本质是一个名字,不占用内存空间。

     

    展开全文
  • 这里考察的是,要修改实参,就要传递实参的地址 笔记:对空指针操作是非法的,而引起崩溃。.C语言函数值传递,str是一个指针(地址),传给形参只是副本,所以str最后还是空指针。 p只是局部变量 退出函数后没有...
  • C语言之形参实参

    2021-02-04 18:14:04
    形参与实参 1.形参和实参是什么 2.形参实参的区别 3.形参与实参知识点 3.1实参的值不随形参的变化而...今天我们来说下c语言形参实参的区别,形参跟实参理解的话也很简单,但是好多同学关于这个知识点都是一知.
  • 【摘要】即将参加全国计算机等级考试的考生们,考试即将到来,...关于2020年全国计算机二级JAVA复习知识点形参实参的具体内容如下:2020年全国计算机二级JAVA复习知识点形参和实参形参:就是形式参数的意思。...
  • C语言形参实参详解

    千次阅读 多人点赞 2019-01-29 15:27:56
    今天我们来说下c语言形参实参的区别,形参跟实参理解的话也很简单,但是好多同学关于这个知识点都是一知半解,没有真正的去透彻,在真正引用的时候还会出现很多问题,而百度的时候又会说看不懂,所以我们今天来做...
  • 浅谈形参实参

    2015-05-17 21:35:14
    以前对形参实参的感觉总是很模糊,为什么模糊不清呢?给自己回答总是:没有好好总结!  这2两个月软考,多次遇到这问题,于是想把这知识点总结一下。  1、定义:  实参:全名叫“实际参数”,它可以是常量、...
  • 今天在回顾学习java基础部分内容面向对象编程的时候整理了一些自己容易混淆的知识点形参实参,成员变量,局部变量,构造方法) public class temp{ int v;//此处 v和a成员变量可以被修饰符修饰如(public ,...
  • python参数   包括位置参数,关键字参数...(实参个数 = 形参个数情况下)实参形参,按参数顺序一一对应 关键字参数 位置参数(2) (实参个数 = 形参个数情况下)实参形参,按参数名进行对应而不是顺序 可
  • 前言Java用了一年多,Python用了一年多,回过头来和C、C++基础知识都搞混了,最近...目录一~十一:琐碎知识点十二:指针十三:结构体一、优先级顺序(自上至下依次降低):!(逻辑运算符-逻辑非) 前置++ 前置-- 强制...
  • 例如我在使用UnityMenuItem特性时,报了错"特性实参必须是特性形参类型常量表达式、typeof 表达式或数组创建表达式" ​​​​​​​ ​​​​​​​ 经过几次定位,原因是因为我字符串不是用const定义...
  • 抽象类与接口区别: ...可大致有以下几: 1.抽象类可以提供成员方法具体实现,而接口只存在用public abstract 修饰没有方法体方法 ; 2.抽象类中成员变量可以是各种类型,而接口成员变量只能是...
  • 为了让大家更好地学习和理解数组,我们先来认识一下内存中"地址"。地址1.计算机中内存是以字节为单位存储空间。 内存每一个字节都有一个唯一编号,这个编号就称为地址。凡存放在内存中程序和数据都有一...
  • 前几天学习了java中参数传递机制,总结了一些知识点:  1·参数类型为基本数据类型:整型:byte,short,int,long ,浮点型:float,double ,字符型:char ,布尔型:boolean    2·参数类型为引用数据...
  • 相关知识点 a. 函数实参形参的传递永远是值拷贝 b. 函数参数 支持不定长参数,不定参数名在函数体 内相当于切片,对切片操作同样适合对不定参数操作 c. 切片是引用类型,值包含指向数组指针 func test1(s .....
  • 算法训练 排序  问题描述  编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列。... 输入格式:输入只有一行,即三个整数,...知识点: C语言中函数参数有两种传递形式 1 传值调用 2
  • 一、函数指针与模板实参推断 可以用函数模板初始化一个函数指针或给一个函数指针赋值 示例 template <typename T> int comp(const T &...上述代码通过函数指针的形参类型指定了函数模板模板参数T
  • //知识点1:库函数学习 // 1、c语言中库函数:IO函数、字符串操作函数、字符操作函数、内存操作函数、时间/日期操作函数、数学函数 // 2、使用库函数,必须包含 #include 对应头文件。 //1.1 strcpy--string ...
  • 如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown基本语法知识。 新改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准Markdown编辑器功能,我们增加了如下几新...
  • 1.1 知识点 函数:就是可以重复执行代码块 2. 组成:参数,功能,返回值 为什么要用函数,因为一部分代码使用次数会很多,所以封装起来, 需要时候调用 函数不调用,自己不会执行 同名函数会覆盖,后面...
  • 下面两个函数就是重载函数,编译时会根据形参列表将这两个函数编译成不同函数,在调用时传入对应参数就可以调用不同重载函数 void overloadfunc(int a[10], int len); void overloadfunc(int *s, int *e); ...
  • socket编程用C++实现客户端和服务端传输文件相关知识点套接字简介Client/Server模式流式套接口工作流程客户/服务器模式需用到接口添加ws2_32.lib库客户端/服务端源码Windows里面两种字符编码方式我解决办法...
  • js中函数的知识点

    2020-09-21 19:47:26
    函数: 1:基本结构 function 函数名 ( ) { 执行语句 } 函数名() ... 形参实参的位置是一一对应, 形参,实参可以有任意多个, 形参即便没有相对应得实参,也不影响代码的执行
  • 目录: 内联函数 引用变量 将引用变量作为函数参数 使用引用作为形参,会改变对应实参的值以及左值的概念 将引用应用于结构 ...实例化和具体化包含的知识点为结构数组,指针数组,模板等 自己选择使用哪...
  • 目录 1. 函数 1.1 函数概念 ...1.4.2 形参实参个数不匹配问题 1.5 函数返回值 1.5.1 概念 1.5.2 return终止函数 1.5.3 函数没有return返回undefined 1.5.4 break,continue,return区别 1
  • C++ 函数知识点

    2021-01-18 23:39:18
    实参形参的初始值,实参类型必须与形参类型匹配。 函数形参列表可以为空。 void fact(int i) { }; fact(3.14); // 正确,因为实参3.14可以隐式转换成int类型。 2.参数传递 当形参是引用时,形参将绑定到...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 372
精华内容 148
关键字:

形参实参的知识点