重读《C语言程序设计》(王曙燕/主编),自我整理(下)

来源:互联网 发布:锐捷交换机边缘端口 编辑:程序博客网 时间:2024/05/01 14:13

      字符输出函数 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 are a worker!<回车>

       只会有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个变量的定义顺序不能错

 


   


原创粉丝点击