字符输出函数 putchar(),字符输入函数getchar() ,getch(),getche()。
gets()和puts()用于字符串的输入和输出。
①putchar();函数向标准输出设备(显示器)输出一个字符,eg: putchar('k') 则在显示器上输出字符k
②getchar();从键盘上读入一个字符,并显示该字符(成为回显)。getchar() "()”中无字符,无参数,该函数的输入一直到“回车”才结束,但只显示输入的第一个字符。
③getch()函数不将键盘上输入的字符回显在屏幕上,常用于密码输入或菜单选择(现在想想是不是和许多"按任何键退出"是这个道理)。
④getche()将输入的字符回显在屏幕上
getche()与后边两个之间的区别是:getchar()用户在键盘上输入一个字符需要按一次回车键,才能被计算机接受,使用getch()和getche()函数时,只能接受一次键入。
⑤gets():回车结束,“回车”不属于这串字符,由“字符串结束标志('\o')代替,此时空格不能结束字符串输入。gets()函数返回一个指针(你知道为什么吗?),gets(字符串变量名)。
⑥puts(字符串数据)
用格式符%c逐个输入和输出字符,这种格式,一般将scanf()和printf()放在循环中,用%c指定格式,用数组元素作为输入和输出项,输入时数组元素钱一定要加“&”,且系统不会自动加'\0 ',输出时也不会自动检测'\0'。
用格式符%s整体输入字符串。在scanf中用格式串“%s"指定格式,直接用数组名作输入项整体输出字符串。eg
char[20]; sanf("%s",c);
①因为数组名本身就代表该数组的首地址,所以scanf()中输出项的数组名前不允许再加地址符&;
②由于是整体输出,所以在输入的字符串末尾,系统会自动加上'\o'
③输入多个字符串,可用空格空开 eg: char s1[20],s2[20],s3[20]; scanf("%s%s%s",s1,s2,s3); 若要输出You are happy! s1→You ...... 正因为scanf()中空格是多个字符串的分隔符,所以企图用此法输入带有空格的字符串给一个字符数组,只有第一个空格前的字符有效。eg:
char str[20];
scanf("%s",str);
只会有You输入到str中,且之存了4个字符:'Y' 'o' 'u' '\0',如果要将带空格的字符全部输入到str中,可以使用字符串处理函数gets.
形参与实参: 实参向参数传递是值传递,规则如下
①形参定义时编译系统并不为其分配空间, 也无初值,只有在调用时,临时分配存储空间,接受来自实参的值,函数调用结束,内存空间释放,值消失。
②实参可以使常量,变量和表达式,但必须在函数调用之前有确定的值。
③实参与形参之间是单向的值传递,所以即使实参为变量,形参值的改变也不会改变实参变量的值。
typedef语句定义格式: typedef 类型名 新类型名
指针变量 声明 基类型名 *指针变量名[=&变量名] 最后的为可选项,将该变量名对应的地址作为初值赋给所定义的指针变量。
指针变量的引用,
①&:取地址运算符,取其右边变量的地址,如:&d取变量d的地址
②*:指向运算符(“间接访问”运算符),表示右边指针变量所指向的变量
如果应定义float *p=&d; *p是变量d,而&*p是变量*p(d)的地址p,&*p等价于d。再看&d是变量d的地址p,而&*d是p所指向的变量d,*&d也就等价于d。
引用指针变量的指针值与引用其他类型变量一样,直接用它的变量名。而引用指针变量所指向的变量时,则应在指针变量名前加运算符,用"*指针变量名"。初学者一定要区分指针变量的值与引用他们指向的值之间的区别。
① 指针变量只有正确赋值后,才能通过它访问指向的变量,不能引用没有赋值的指针变量,不要误以为只要指针变量p定义了,它所指向的变量*p就存在了。实际上,指针变量p只有正确赋值后,它才存储了某一个变量的地址,这是它所指向的变量*p才存在,才能给*p赋值。
② P=&a;是给指针变量p赋值,*p=3;是给p指向变量赋值。两者含义完全不同。
③ 指针变量只存放地址,正如整数或其他非地址变量不能作为地址值给指针变量赋值一样,也不能用整型或其他非地址量给指针变量赋值。Eg:float *p1;p1=2000; 编译时将会出现警告错误,不能用整数给指针变量赋值,反过来不能将地址值赋给非指针变量。 Eg:int n,p; p=&n; 警告错误:定义p前无*号不是指针变量,整型变量不能存储地址。
二级指针
要实现对指针类型变量本身的引用传递,就需要用指向该指针的指针变量做形参,这种指向指针类型的指针变量成为二级指针变量。函数调用时,将实参指针变量本身的地址赋给形参,通过该地址的值传递实现将它指向的指针变量的引用传递。
二级指针变量定义的形式如下:
基类型名 **二级指针变量名[=&指针变量名]
说明“*”的结合性是从右到左,因此**q相当于*(*q),显然如果没有最前面的“*”,q就是一个指向整型变量的指针变量。现在前面又有一个“*”号,表示q是指向整型变量的指针变量。引用时,*q就是q指向的整型变量,**q就是q指向的指针变量所指向的整型变量。 Eg: int i ,*p=&i; //定义p为指向整型的指针变量,初值为 &i int **q=&p; //定义q为指向整型指针的指针变量,初值为&p
int k,*p0=&k,**q0=&p0;//注意3个变量的定义顺序不能错