C学习笔记(c重点整理)
C学习笔记:char与int互转

C学习笔记:char与int互转学了这么久,总结出4种int与char互相转换的⽅法:
1.ASCII法
推荐度:5星★★★★★
这是通⽤性最强的⽅法,也⽐较简单。
缺点是只能⼀个⼀个转换
代码:
char cNum='5',result1;
int iNum=5,result2;
//char to num
result2=cNum-48;
//num to char
result1=iNum+48;
总之,int到char就是+48
char到int就是-48
2.函数法
推荐度:3星★★★
使⽤itoa、atoi(都在stdlib.h头⽂件)函数转换
操作简单,能⼀次性转换(不是⼀位⼀位的),不过有个很⼤的问题:itoa函数并⾮标准C的实现,只能在windows下编译通过,换句话说,如果你是写软件,没问题。
但如果你是搞信息奥赛,那么这个函数不⼀定能通过编译。
具体的使⽤⽅法,请百度。
3.sprint法
推荐度:2星★★
此⽅法只能做到int转char。
不过配合atoi,也能达到⽬的。
是标准的C函数
代码:
int num=1234567;
sprintf(str, "%d", num);
//此时str就是“1234567”了。
注意,str是个char数组
4.枚举判断法
推荐度:0星
额……就是if(a=’1′)b=1这样的……
都学了OI了,不⾄于还这么搞吧?。
CPrimer中文版(第4版)知识学习记录文本

C++Primer中文版(第4版)学习笔记调用GNU 或微软编译器调用GNU 编译器的默认命令是g++:$ g++ -o prog1微软编译器采用命令cl 来调用:C:\directory> cl -GX prog1.cppacm pc2编译器搭配下面是pc2配置:(以vc为编译环境)配置环境变量:jdk设置:path=C:\Program Files\Java\jdk1.6.0\bin;vc编译器设置:path=C:\Program Files\Microsoft Visual Studio\VC98\Bin;lib=C:\Program Files\Microsoft Visual Studio\VC98\Lib;include=C:\Program Files\Microsoft Visual Studio\VC98\include环境变量配置完成之后,设置下pc2就ok了!pc2设置如下:compile com line: cl.exe {:mainfile}Executable Filename:{:basename}.exeprogram execution command line:{:basename}.exe做到这些配置,基本上编译就不成问题了!注意,期间可以需要到C:\Program Files\Microsoft Visual Studio\COMMON\Tools路径下拷贝mspdb60.dll到C:\Program Files\Microsoft Visual Studio\VC98\Bin;!这个自己调试就Ok了!访问main 函数的返回值的方式和系统有关。
不论UNIX 还是Windows 系统,执行程序后,必须发出一个适当的echo 命令。
UNIX 系统中,通过键入如下命令获取状态:$ echo $?要在Windows 系统下查看状态,键入C:\directory> echo %ERRORLEVEL%再谈编译编译器的部分工作是寻找程序代码中的错误。
(完整)C语言 谭浩强学习笔记

C语言谭浩强版笔记第一章程序设计和C语言1、计算机能直接识别和接受的二进制代码称为机器指令,机器指令的集合就是该计算机的机器语言。
2、语言的发展历史:①机器语言②符号语言③高级语言3、高级语言的发展:①非结构化语言②结构化语言③面向对象的语言4、C语言的祖先是BCPL语言5、在字符串中的//和/*都不作为注释的开始。
而是作为字符串的一部分。
【但是在vc++6.0中//显示编译错误】6、不要以为在max函数中求出最大值z后就会自动地作为函数值返回调用处,必须用return语句指定将哪个值作为函数值。
也不要不加分析地在所有函数后面都写上return 07、一个程序由一个或多个源程序文件组成8、全局声明:即在函数之外进行的数据声明,在函数外面声明的变量称为全局变量。
例如把int a,b,sum;放到main函数的前面9、函数是C程序的主要组成部分,编写C程序的工作主要就是编写一个个函数10、一个C语言程序是由一个或多个函数组成的,其中必须有且只有一个main函数11、一个小程序只包含一个源程序文件,在一个源程序文件中包含若干个函数(其中一个为main函数),若程序规模太大,可以使一个程序包含若干个源程序文件,每个源程序文件又包含若干个函数【一个源程序文件就是一个程序模块,一个程序分成若干个程序模块】12、在进行编译时是以源程序文件为对象进行的【分别对各源程序文件进行编译得到相应的目标程序,然后再将这些目标程序连接成为一个统一的二进制可执行程序】13、C语言的这种特点使得容易实现程序的模块化14、一个函数名后面必须跟一对圆括号,括号内写函数的参数名及其类型。
如果函数没有参数,可以写void或空括号【如int main(void)或int main()】15、void dump(){}它是一个空函数,但是是合法的16、程序总是从mian函数开始执行的,不管位置在哪儿17、程序中对计算机的操作是由函数中的C语句完成的18、二进制目标程序在visual C++中的后缀为.obj19、可执行程序在visual C++中的后缀为.exe20、一个源程序经过编译后得到的目标程序要经过连接阶段与函数库进行连接才能生成可执行文件21、程序设计的任务:①问题分析②设计算法③编写程序④对源程序进行编辑、编译和连接⑤运行程序,分析结果⑥编写程序文档第二章算法1、对数据的描述:在程序中要指定用到哪些数据类型以及这些数据类型和数据的组织形式,这就是数据结构。
c语言学习心得(优秀10篇)

c语言学习心得(优秀10篇)(经典版)编制人:__________________审核人:__________________审批人:__________________编制单位:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的经典范文,如总结报告、心得体会、策划方案、合同协议、条据文书、竞聘演讲、心得体会、教学资料、作文大全、其他范文等等,想了解不同范文格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!Moreover, our store provides various types of classic sample essays, such as summary reports, insights, planning plans, contract agreements, documentary evidence, competitive speeches, insights, teaching materials, complete essays, and other sample essays. If you want to learn about different sample formats and writing methods, please stay tuned!c语言学习心得(优秀10篇)当我们受到启发,对学习和工作生活有了新的看法时,可以通过写心得体会的方式将其记录下来,从而不断地丰富我们的思想。
C Primer Plus(第五版)学习笔记

C Primer Plus(第五版)学习笔记第一章概览1.1 C语言的起源记住Dennis Ritchie和Ken Thomson。
是在设计UNIX操作系统的时候开发的。
1.2 使用C语言的理由C是一种融合了控制特性的现代语言,而我们已发现在计算机科学的理论和实践中,控制特性是很重要的。
其设计使得用户可以自然地采用自顶向下的规划、结构化的编程,以及模块化的设计。
这种做法使得编写出的程序更可靠、更易懂。
C是一种高效的语言。
C程序往往很紧凑且运行速度快。
C是一种可移植语言。
由于C与UNIX的紧密联系,UNIX系统通常都带有一个C编译器作为程序包的一部分。
Linux中同样也包括一个C 编译器。
C强大而又灵活(计算机世界中经常使用的两个词)。
C面向编程人员的需要。
它允许您访问硬件,并可以操纵内存中的特定位。
它具有丰富的运算符供选择,让您能够简洁地表达自己的意图。
多数C实现都有一个大型的库,其中包含有用的C函数。
这些函数能够处理编程人员通常会面对的许多需求。
C的简洁性与其丰富的运算符相结合,使其可能会编写出极难理解的代码。
没有谁强迫您编写含糊难懂的代码,但存在这样的可能性。
试问,除C之外还有哪种语言存在一年一度的“含糊代码”(ObfuscatedCode)竞赛呢?1.3 C语言的发展方向不管C++和Java这些较新的语言如何流行,C在软件产业仍然是一种重要的技能,在最想获得的技能中,它一般都列在前10名。
特别是在嵌入式系统的编程中,C已开始流行。
也就是说,它将用来为汽车、照相机、DVD播放器和其他现代化设备中逐渐普及的微处理器编程。
同样,C已开始进入长期以来一直属于FORTRAN的科学编程领域。
最后,由于它是一种适合用来开发操作系统的语言,C在Linux的开发中也扮演着重要的角色。
1.4 计算机工作的基本原理CPU的工作非常简单,至少在我们所做的这一简短描述中是这样的。
它从内存中获取一个指令并执行该指令,然后从内存中获取下一个指令并执行。
C语言学习笔记(004)-数组名和数组首地址(转)

C语⾔学习笔记(004)-数组名和数组⾸地址(转)⼀个变量有地址,⼀个数组包含若⼲元素,每个数组元素都在内存中占⽤存储单元,它们都有相应的地址。
指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某⼀元素的地址放到⼀个指针变量中)。
所谓数组的指针是指数组的起始地址,数组元素的指针数组元素的地址。
这种指针变量的定义与以前介绍的指向变量的指针变量相同。
应当注意,如果数组为int型,则指针变量亦应指向int型。
规定数组名代表数组的⾸地址,也就是第⼀个元素的地址。
因此,下⾯两个语句等价:p=&a[0];p=a;注意数组a不代表整个数组,上述"p=a;"的作⽤是"把a数组的⾸地址赋给指针变量p",⽽不是"把数组a各元素的值赋给p"。
在定义指针变量时可以赋给初值:int*p=&a[0];它等效于:int*p;p=&a[0];当然定义时也可以写成int*p=a;它的作⽤是将a的⾸地址(即a[0]的地址)赋给指针变量p(⽽不是*p)。
假设p已定义为指针变量,并已给它赋了⼀个地址,使它指向某⼀个数组元素。
如果有以下赋值语句: *p=1;表⽰对P当前所指向的数组元素赋以⼀个值(值为1)。
C规定对p+1指向数组的下⼀个元素(⽽不是将p值简单地加1)。
如果p的这初值为&a[0],则: (1)p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元素。
(2)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
(3)指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。
根据以上叙述,引⽤⼀个数组元素,可以⽤: (1)下标法,如a[i]形式; (2)指针法,如*(a+i)或*(p+i)。
要输出各元素的值有三种⽅法:○1下标法○2通过数组名计算数组元素地址,找出元素的值。
○3⽤指针变量指向数组元素。
C语言学习笔记-LED

1.#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器2.3.sbit led=P0^0; //将单片机的P0.0端口定义为led4.5.void main()6.{7.led=0; //P0.0端口设置为低电平8.while(1);9.}这是一个点亮LED灯的程序,下面对此进行解析#include "reg52.h"# 符合表明这一行是在编译器接手前由c预处理器处理的语句#include 语句是c预处理器指令Reg52.h 单片机头文件,此文件中定义了单片机的一些特殊功能寄存器10.sbit led=P0^0; //将单片机的P0.0端口定义为ledsbit是定义特殊功能寄存器的位变量11.void main()12.{13. while(1);14.}Main是一个普通的名字,其他函数可以随意命名但是主函数不行,它是唯一的选择。
()的功能则是表示main()是一个函数很快您就会学到更多的函数,但现在,就请记住这个函数是C程序的基本模块Void则是函数类型,中文翻译是无类型。
但是慢慢学习后就会发现有些函数的类型是int 或者是 char{} 花括号,它划定了main函数的界线。
通常,所有的C函数都是使用花括号来表示函数体的开始与结束。
{}花括号,[]中括号,()小括号的作用是不一样的,不要混淆。
1.#include <reg52.h> //51头文件2.#include <intrins.h>//包含循环右移函数_cror头文件3.4.#define uchar unsigned char //宏定义5.#define uint unsigned int //宏定义6.7.sbit LED1 = P1^0; //位定义LED1硬件接口8.uchar i; //申明循环计数变量9.uchar temp;//P1口状态暂存变量10.11.//毫秒级延时函数12.void delay(uint z)13.{14.uint x,y;15.for(x=z;x>0;x--)16.for(y=120;y>0;y--);17.}18.19.//主函数20.void main()21.{22.temp = 0x7f; //定义LED灯初始状态,从LED8开始亮23.P1 = temp; //赋值给P1,点亮LED824.delay(1000); //延时1000毫秒25.while(1) //大循环26.{27.for(i = 0; i < 8; i++)28.{29.temp = _cror_(temp,1);//循环右移,LED从左至右点亮30.P1 = temp;31.delay(1000);32.}33.}34.}“#define uchar unsigned char”是表示之后代码中的“uchar”全部代表“unsigned char”,并且是在执行编译预处理时就进行了实际的替换操作。
C语言基础学习笔记

C语言基础学习笔记(第一版修改)丁炳亮1数据类型和表达式1.1计算机内数据存储方式理解与测试:什么是补码?我们得先知道模的概念。
模“模”是指一个计量系统的计数范围。
如时钟等。
计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。
例如:时钟的计量范围是0~11,模=12。
表示n位的计算机计量范围是0~2^(n)-1,模=2^(n)。
“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。
任何有模的计量器,均可化减法为加法运算。
例如:假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨4小时,即:10-4=6;另一种是顺拨8小时:10+8=12+6=6在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。
对“模”而言,8和4互为补数。
实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。
共同的特点是两者相加等于模。
二进制中整数的补码求法是:正数的补码为原码,负数的补码是符号位不变其他位全部取反再整个数加1。
我们可以通过下面的代码看下负整数在计算机内部的表示。
void f(int n){unsigned int i;for(i=1,i<<=15;i;i>>=1){if(i&n)printf("1");elseprintf("0");}printf("\n");}main(){int a=-0xff;f(a);getch();}输出的结果是1111111100000001。
1.2变量与常量理解与测试:1)类型声明在计算机内部数据是以字节为单位存储的,但是我们需要的数据类型有很多种,每种数据类型所占字节和存储方式都不一样。
类型声明的作用就是告诉计算机以哪种“格式”去读写该数据数据。
类型说明符变量名1,变量名2......,变量名n;类型说明符有基本类型(字符型、整数型、单/双精度型)、高级类型(结构体型、共用体型、枚举类型)、指针型等,其中指针类型包括指向基本类型的指针类型、指向高级类型的指针型和指向函数的指针类型(指向函数指针声明格式在后面章节)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#学习笔记1.C#具有所有面向对象的语言的所有特性:封装,继承,多态。
在C#系统中,所有的类型都可以看作一个对象。
C#只允许单继承,即一个类不会有多个基类,C#不会有全局函数,不会有全局变量,不会有全局常数,所有的一切只能封装在一个类中。
包括四个部分:vos类型系统;元数据;公用语言规范;虚拟执行系统。
ing system表示导入名称空间。
4.让我们从第一个程序开始就记得:每个东西都必须属于一个类,类里面的方法总是为我们完成某件工作的。
在C#中,程序的执行总是从main()方法开始的,一个程序中不允许出现两个或两个以上的main()方法。
对于习惯学C控制台程序的读者,必须要牢记:main()方法必须包含在一个类中。
5.利用string可以方便地对字符串进行连接或剪切。
例:string s=”good”+”morning”;charx=s[3]字符串可以通过下标进行索引,得到一个字符。
6.我们可以用//进行单行标注,/* */进行多行标注。
7.在C和C++中,任何非0值都表示真,在C#中,任何非0值都不能代替true.在其它类型的整型值和布尔值之间不存在任何的转换,将整型转换成布尔型是不合法的。
8.把一系列相关的变量组织成单一实体的过程称为生成结构的过程。
这个单一实体的类型叫结构类型,每一个变量就是结构的成员。
9.结构类型包含的成员类型可以相同,也可以不同。
我们甚至可以把一个结构类型当作另一个结构成员的类型。
10.枚举实际上是为一组在逻辑上密不可分的整数值提供便于记忆的符号。
结构类型变量的值由各个成员的值组合而成。
而枚举则不同,枚举类型的变量在某一时刻只能取枚举中某个元素的值。
按照系统的设定,每个元素的类型都为整型。
且第一个元素的值为0,后面的每个元素梯加1,也可以直接赋值。
如把前面第一个元素的值设为1,后面的元素不用设,系统自动将后面元素的值递加1.11.C#中另一大数据类型是引有类型。
其含义是该类型的变量不直接存储所包含的值,而是指向它所要存储的值。
也就是说引用类型存储实际数据引用值的地址。
12.类是面向对象编程的基本单位,是一种包含数据成员,函数成员和嵌套类型的数据结构。
类和结构都包含了自己的成员,但它们的区别是:类是引用类型,而结构是值类型。
13.如果我们对某个类定义了一个变量,则我们就将它称为类的一个实例。
14.我们常用到的类:object类。
这个类是其它所有类的基类,其它类型可以直接或间接地从object类中继承。
因此,对一个object类的变量可以赋于任何类型的值。
15.代表?在声明代表时,只需要指定代表指向的原型的类型,它不能有返回值,也不能带有输出类型的参数。
如:delegate int Mydelegate().在使用的时候:Mydelegate d=new Mydelegate(p.instanceMethod).为什么不用delegate d= new Mydelegate(p.instanceMethod)呢?原因是delegate相当于class需要一个名字,class myclass{…}这个class的名字是myclass而且它包含有其它元素、常数或者函数,变量等。
跟char a=a不同,它不包含有其它的元素,a就是一个变量。
而myclass不是变量,它只一个名字。
而myclass a=new myclass(); a才是变量,是类的一个实例。
在这里,这个delegate的名字是Mydelegate,也并不是一个变量。
16.变量从用户角度来说,是存储信息的基本单元,从系统角度来说,变量就是计算机内存中的一个储存空间。
17.静态方法不能用类的实例来访问,必须用类名来访问。
18.数组的声明:数组的类型[数组的元素个数] 数组的名字;数组个数可以通过数组名加圆点加Length获得。
如arr.Length表示arr数组的个数19.在进行批量处理数据的时候,我们要用到数组.数组是一组类型相同的有序数据.20.数组的初始化:int[] a1=new int[]{1,2,3};为什么是new int[],而不是new a1呢:因为int[]是类型,a1是int[]类型的一个实例.而且a1所代表的是{1,2,3},并不是函数.与delegate int Myclass();不同,Myclass()虽然是一个名字,但它可以代表一个函数,不是常数.原则:类型后面的名字如果可以代表函数,则这个名字就是一种类型.如果类型后面的名字代表常数,则这个名字不是一种类型,只是类型的一个变量.或者可以用另一种说法:如果名字后面含有(),{},[]则在赋值或设定实例的时候new后面要用该名字作为类型.21.变量名不能与C#中的关键字名称相同;变量名不能与C#中库函数名称相同。
22.静态变量:static int a;一旦静态变量所属的类被加载,直到包含该类的程序运行结束前它将一直存在。
23.稳性数据转换实际上就是从低精度的数据转换成高精度的的数据类型。
如:ushort转换成int.24.隐式枚举转换允许把十进制数0转换成任何枚举类型,对其它整数则不存在这种隐式转换。
25.从元素类型为TS的数组类型S到元素类型为Tt的数组类型T转换,如果元素类型为值类型,则不能进行隐式转换。
26.有一个元素类型为int的枚举类型E,则当执行从E到byte的显示枚举类型转换时,实际上作的是从int 到byte的显示数字转换;当执行从byte到E的显式枚举转换时,实际上是执行byte到int的隐式数字转换。
如:Weekday day;day=(Weekday) 3;实际上是E到byte的显示枚举类型转换。
27.如何使用枚举:enum Color{red=0, yellow, blue,green,purple};Color color_arr = new Color();Color_arr=(Color) 2;Console.WriteLine(“Color_arr{0}”,Color_arr);..则其输出结果为blue.28.赋值操作符(=)和条件操作符(?:)按照右结合的原则,即操作从右到左的顺序执行。
Y=(x>10? 0:1).29.枚举类型的加法:Weekday day1=Weekday.Sunday; Weekdayday2=Weekday.Saturday;Weekday day3=day1+6;枚举型加法实际上枚举基类型元素相加即一般为(int 型相加)。
30.如果两个整数类型的变量相除又不能整除,返回结果是不大于相除之值的最大整数。
31.求余运算:5%3=2;5%1.5=0.5.32.as操作符用于通过引用转换或装箱转换将一个值显式地转换成指定的引用类型。
33.位运算符就是对数按二进制位进行运算的操作符。
位运算中的异或运算,当两个位相同时,异或运算结果为0,不相同时异或运算为1.移位运算,左称位将操作数向左位移,高位被抛弃,低位顺序补0.右移运算时,如果X为非负数,最高位设为0;如果X为负数,最高位设为1,即最大为-1.34.自增自减操作符:自增自减操作符有前缀和后缀之分。
对于前缀操作符,遵行的原则是“先增减,后使用”,后缀则相反,“先使用,后增减”。
35.new操作符:new操作符用于创建一个新的类型实例。
它有三种形式:1,对象创建表达式。
2,数组创建表达式。
3代表创建表达式。
36.typeof操作符用于获得系统原型对象的类型。
37.check 和 uncheck操作符只影响其置于括号中的运算的溢出检查。
二流程控制1.C#提供的选择语句有if和switch语句。
2.如果if或else语句包含的嵌套语句只包含一条执行语句,则嵌套部分的大括号可以省略。
3.每一条else与离它最近且没有其它 else与之配对的if相搭配。
4.if语句仅允许布尔数据类型的结果。
例:if(args.length=0)是正确的。
而if(args.length)是不正确的。
args.length返回一个整形数(integer)。
5.switch语句是只能有一个default标签。
6.C#中它要求每个case标签项后使用break语句或中转语句goto,即不允许从一个case自动遍历到其它case.如果想遍历其它语句,则可以加入下面两条跳转语句:goto case lable:跳至标签语句执行。
Goto default:跳至default标签执行。
7.数组的初始化:int[] a1=new int][]{1,2,3,4,5}8.在事先知道循环次数的条件下,用for循环是比较方便的。
9.while语句中允许使用break语句来结束循环。
也可以使用continue语句来停止内嵌语句的执行,继续进行while循环。
10.可以使用break和continue语句来控制循环的表达。
如:要求打印除7以外的0到9的语句,只需要在到打印7的时候,跳出打印语句就可以了。
For(int i=0;i<9;i++){ if i==7 continue;console.write(i);}11.foreach(Myint x in Prime){12.预编译和条件编译都是以#开头的。
可以帮助我们在程序执行过程中发出编译的错误或警告。
13.溢出的处理用checked来检测。
14.预处理指令如果出现在其它输入输出元素中间就不会被执行。
中writeLine或Readline 等中间。
三类1.C#中的类只支持单继承。
2.对类成员的访问:1.公有成员。
Public,允许外部访问。
2.私有成员。
Private,只允许类中的成员访问。
派生类都不能访问。
3.保护成员。
Protected.方便派生类的直接访问,同时又希望对外部是隐藏的。
4.内部成员。
Internal.对于同一包内的程序或库是透明的。
而对于包外是隐藏的。
5.类中的成员要么是静态要么是非静态。
一般来说,静态成员是属于类所有,非静态成员则属于类的实例-对象。
访问的时候:静态:类名.成员名;非静态:实例名.成员名(this.成员名)static6.关键字const用于声明常量,后跟数据类型的声明。
例:public const double x=1.0;7.构造函数不声明返回类型,构造函数用于执行类的实例的初始化。
8.折构函数在类的实例超出实用范围时,我们希望收回它所占的存储时使用。
析构函数跟类名相同,只是在前面加上一个符号:~9.值参数:使用值参数时,初调用的方法不会修改内存中实参的值。
引用型参数:引用型参数并不开辟新的内存区域。
当利用引用型参数向方法传递形参时,编译程序将把实际参数所在内存中的地址传递给方法。
10.substring(0,i)从此实例检索子字符串。