函数
讲讲递归就差不多,数的阶乘
#include<iostream>
using namespace std;
int fun(int n)
{
if(n==1)
return 1;
else
return n*fun(n-1);
}
int main()
{
int a;
cin>>a;
cout<<fun(a);
}
每一次调用函数都是另外开辟空间,并且是开辟在栈上面(先进后出)
数组
数组通用
1.数组下标从0开始
2.数组名就是第一个元素的地址
3.数组长度可以省略,但是必须要明确后面有多少个元素
字符数组
初始化:
char a[]={‘a’,‘b’}; //错误,没有写标志结束的空字符 ‘\0’
char a[]={‘a’,‘b’,’\0’}; //正确
char a[2]=“ab”; //错误,没有给标志结束的空字符留出位置
char a[3]=“ab”; //正确
注意:作为标志结束的空字符在用%s输出时不会被输出。
什么时候出现\0
有两种方法:
-
用字符数组;
-
用字符指针;
对应两种定义方法,有不同的初始化以及赋值方法
对字符数组,有以下几种定义方法:
char str[]="12345"或给字符串加上大括号:char str[]={“12345”};
这种方法定义时,系统会自动在字符串的末尾加上字符串结束符,即 ‘\0’,
char str[10]={‘1’,‘2’,‘3’,‘4’,‘5’};
这种方法定义时,系统会自动从未初始化的元素开始,将之后的元素赋为\0,如上面的数组str中的元素实际上是:‘1’,‘2’,‘3’,‘4’,‘5’,’\0’,’\0’,’\0’,’\0’,’\0’
但是!
如果我们位置满了:
char str[10]={‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘10’};
这种情况就不会添加\0
char str[]={‘1’,‘2’,‘3’,‘4’,‘5’};
这种方法定义时,系统不会自动在字符串的末尾加上字符串结束符;
所以,采用该方法定义时,一般人为地加上\0,即char str[]={‘1’,‘2’,‘3’,‘4’,‘5’, ‘\0’};
易错情况:
1、char a[10]; a[10]=“hello”;//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!
2、char a[10]; a=“hello”;//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!
常用的易错字符串函数
1.不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。
2.此时用sizeof()函数可以正确求出其所占的内存大小;
但用strlen()函数不能正确求出其长度,因为strlen是通过\0判断字符串结束的, ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
3.strcpy()字符串复制函数
4.strcat() 函数用来连接字符串,其原型为: char *strcat(char *dest, const char *src);
scr中结束符必须是\0,否则会遇到随机的\0才结束