美文网首页C语言入门经典C语言
HeadFirst笔记系列——第二章 指针和输入输出

HeadFirst笔记系列——第二章 指针和输入输出

作者: 安新小子 | 来源:发表于2017-11-30 15:36 被阅读9次

    作为一个Android开发者如果想阅读源码只会Java语言是不够的,由于工作的原因要求去了解源码的一些逻辑,发现在看书和阅读源码的过程中不懂C语言真的寸步难行,只靠Java的那点基础去理解C语言的语法很费劲,所以在工作的间隙去学习C语言,目的不是能够写出多牛的C代码,只是能够看得懂别人的C代码,知道每段代码的意思。下面从第二章开始记录我读《HeadFirst C》的笔记。

    指针

    指针即数据存放的地址值,指针变量接收的就是地址值
    指针的使用方法:

    &x   表示变量x的地址值
    int*  是一个指针数据类型,表示一个存放整型变量的地址值数据类型
    *y     表示地址y上存放的数据
    

    如下:

    int   x = 5;
    int*  m = &x;      //m就是一个指针变量,接收x的地址值
    x = *m;           //获取x地址值上存放的变量
    

    注意:
    1:指针的长度只和操作系统的位数有关,32位的操作系统指针长度为4,64位操作系统的指针长度为8
    2:当数组被当做形式参数传递的时候,数组可以被用来当做指针来处理,它指向数组的第一个地址位置

    指针和数组的区别:
    1:使用sizeof不同,指针变量的长度只有4和8,但是使用sizeof(数组),返回的是数组的长度
    2:数组变量的地址就是它本身,指针变量的地址不是它本身。如下:

    char s[] = "How big is it";  //变量s是数组变量
    char*  t = s;                //变量t是指针变量
    

    其中&s==s ,但是 &t != t ;
    3:数组变量不能指向其他地方。
    创建指针变量的时候,计算机会为它分配4或8个字节的存储空间,但是创建数组的时候计算机不会为数组变量分配任何空间,编译器仅在出现它的地方把它替换成数组的实际地址,所以不能把数组变量指向其他地方。
    上面的例子 s = t ,将t 赋值给 s 会报错

    输入

    C语言中输入主要用到两个函数scanffgets

    scanf函数

    1:使用方式:

    char name[5];
    printf("Enter your name:");
    scanf("%4s",name);
    printf("name: %s\n",name);
    

    scanf接收一个char指针,上面的代码要求总共会读取4个字符,加上字符串结束符\0,一共5个所以字符数组的长度定义为5,如果用户输入大于4个字符,也只会显示4个字符

    2:scanf的弊端:
    使用这个函数的时候一定要严格限制用户输入的字符数,一旦输入的过多就会导致缓冲区溢出,所以scanf的第一个参数我们一般会控制字符数而不是直接使用%s,但是并不是什么时候输入的字符多了都会报错的,即使这样我们也要控制

    fgets 函数

    1:使用方式:
    fgets() 这个函数和scanf() 一样也是接收char指针,但是在使用它的时候你必须给出最大长度·,fgets的返回值是char* 类型,是用户输入的字符串。

    char food[5];
    printf("your food:");
    fgets(food,sizeof(food),stdin);  //sizeof设置了最大长度,stdin表示数据来自键盘
    printf("you enter is %s\n",food);
    

    2:使用注意:
    这里food是一个数组所以可以使用sizeof来获取长度,当food是一个指针的时候就不能使用sizeof了,因为指针的长度是固定的,此时需要显式的给出具体长度

    fgets的长度已经算上了结束符\0,所以上面的例子food中也只能接受4个字符

    scanf函数和fgets 函数的区别

    1:使用方式不同。都接收一个字符数组,但是scanf是手动限制用户输入的字符个数,fgets是通过参数的形式限制

    //scanf的使用
    char name[5];
    printf("Enter your name:");
    scanf("%4s",name);            //在这里手动限制用户,只能输入4个字符,因为一共就接收5个
    printf("name: %s\n",name);
    
    //fget的使用
    char food[5];
    printf("your food:");
    fgets(food,sizeof(food),stdin);  //在这里通过参数sizeof 来限制输入的字符数,也是只能输入4个
    printf("you enter is %s\n",food);
    

    2:返回值不同。scanf 返回值是用户输入的数据条数,int类型;fgets 返回值是用户每次输入的数据,字符串类型

    输出

    C语言中输出到控制台主要使用 puts 和 printf 函数
    二者的区别:这两个函数都是用来打印字符串的,区别是puts输入完之后会自动换行,printf不会自动换行,需要手动加上\n

    C语言中的字符串

    在C语言中是没有字符串这个变量的,C语言中字符数组就相当于java中的字符串,使用流程如下:

    1:导入C标准库 <string.h>
    2:对字符串的操作方法:

    int strchr(char* original_str , char* target_str ) : 在字符串中查找字符,返回正表示找到,负数表示没有
    int strcmp(char* a,char* b): 比较字符串,比较字符串在字母表中的前后顺序,返回int值。正:升序;负:降序
    strcpy() : 复制字符串
    strlen() : 返回字符串的长度
    strcat() : 连接字符串
    strerror(errno) : 这个函数会显示exec()函数运行过程中出现的错误

    相关文章

      网友评论

        本文标题:HeadFirst笔记系列——第二章 指针和输入输出

        本文链接:https://www.haomeiwen.com/subject/lsmvbxtx.html