zoukankan      html  css  js  c++  java
  • c语言程序设计案例教程(第2版)笔记(四)—指针、分配存储空间、文件

    零散知识点:

    • 指针类型:每个变量占用的首单元地址称为这个变量的存储地址。
    • &”为“取地址运算符”。格式:&  变量名。功能:返回指定变量的存储地址
    • *”为“取内容运算”。格式:*  变量名。功能:返回指针型变量所指变量的内容
    • 指针型变量的定义:<数据类型>   * <指针型变量名>。
    • int  *intptr;          // intptr是一个指向int类型的指针型变量
    • * intptr=a;
    • intptr=&a           // a的地址赋值给指针型变量intptr
    • char *p[4]           //p是一个含有4个元素的一维数组,每个元素是指向字符的指针
    • 指针型变量的引用
    • 输出指针所指变量部分的内容:printf("%d, %c",*p,*c);
    • 通过键盘输入两个指针所指的变量部分进行赋值:scanf("%d%c", c, p);
    • 指针与一维数组(int iarray[10])
    • 数组名是一个含有数组第一个元素地址的常量指针。iarray=& iarray[0]=可以得到数组iarray的存储地址。
    • iarray+1=& iarray[1]=可以得到数组iarray[1]的存储地址。
    • 假设有指针型变量的定义int *ptr,利用赋值语句ptr=iarray将数组的存储地址赋给这个指针型变量,可以得到:*ptr=iarray[0],*(ptr+1)=iarray[1],*(ptr+9)=iarray[9]。
    • 指针与二维数组(int a[3][2])
    • a[0]是含有2个int类型元素的一维数组。
    • a[0]+1=&a[0][1]; a[0]=&a[0][0]; a[1]=&a[1][0]; a[2]=&a[2][0];

    • 利用指针对数组元素进行操作
    • 假设有如下定义:int iarray[20];  int *ptr;,则ptr是一个所指类型为int的指针型变量,当利用赋值语句ptr=iarray;将一维数组iarray的地址赋给ptr时,ptr+i将指向数组下标为i的元素。
    • 将iarray的内容显示输出的方法如下:
    1. for (ptr=iarray,i=0;i<20;i++)    printf("%d",*(ptr+i));
    2. for (ptr=iarray;ptr<array+20;ptr++)    printf("%d",*ptr);
    •  指针与数组实例:从键盘输入一个文本行,统计其中包含的空格和非空格字符的数量
     1 #include<stdio.h>
     2 #pragma warning(disable:4996)
     3 #define NUM 80
     4 
     5 main()
     6 {
     7     char textline[NUM];
     8     char *s;
     9     int charnum = 0, spacenum = 0;
    10     printf("enter a string:");
    11     gets(textline);
    12     for (s = textline; *s != ''; s++){
    13         if (*s == ' ')
    14             spacenum++;
    15         else
    16             charnum++;
    17     }
    18     printf("
    %d characters and %d space in string", charnum, spacenum);
    19 }
    • 指针与字符串
    • 计算字符串长度
    int strlen(char *s)
    {
    	int len = 0;
    	for (; *s != ''; s++, len++);
    	return len;
    }
    • 比较两个字符串大小
    int strcmp(char *s, char *t)
    {
    	for (; (*s != 0) && (*t != 0) && (*s == *t); s++, t++);
    	return *s - *t;
    }
    
    • 拷贝字符串
    int strcpy(char *s, char *t)
    {
    	while ((*s = *t) != ''){
    		s++;
    		t++;
    	}
    }
    
    • 动态申请存储空间
    • void *malloc(int size)     //请求系统分配size个字节的连续存储空间。若分配成功,将返回所分配的存储空间的首地址;否则返回NULL
    • void  free(void *p)     //释放由指针p指向且由malloc()函数分配的存储空间
    • 利用malloc()分配的空间必须用free()函数释放
    • 对每个元素赋值的方法:
    for (i = 0; i < 20; i++)
    	*(ptr + i) = rand(100);
    //或
    	ptr[i] = rand(100);
    • 文件
    • c源代码形成的.c源程序文件;对.c文件进行编译后生成的.obj目标文件;经过连接得到的.exe可执行文件。
    • 文件被划分成两个类别:文本文件、二进制码文件
    1. 文本文件:以字符为基本单位,每个字符占用一个字节存放对应的ASCII,这种文件形式又被称为ASCII文件;
    2. 二进制文件:指直接按照二进制编码形式存储数值的方式,在文件中将直接存储这个二进制数值
    • 针对文件的访问,C语言采用了缓冲式文件处理机制。这种处理机制的基本策略是:为每个文件开辟一块内存区域,当对文件进行读操作时,先从文件中读取一批数据至这块内存区域,直到满为止,然后系统再从这块内存区域提取数据赋给程序中的变量;与此相反,当对文件进行写操作时,先将数据放入这块内存区域中,直到满为止,然后系统再将这块内存区域中的数据一次性地写入磁盘文件中。因此,这块内存区域起到了一个缓冲的作用,因此,称为“(文件)缓冲区”。
    • 为了处理文件,C语言提供了一个标准结构体类型FILE。其类型声明如下所示:
    typedef struct {
    	int			level;      /*文件缓冲区的占用状况*/
    	unsigned		flags;      /*文件状态标志*/
    	char			fd;         /*文件描述符*/
    	unsigned char	        hold;       /*没有文件缓冲区时保存字符*/
    	int			bsiae;      /*文件缓冲区大小*/
    	unsigned char	        *buffer;    /*数据缓冲区*/
    	unsigned char	        *curp;      /*指向当前的读写位置*/
    	unsigned		istemp;     /*临时文件指示*/
    	short		        token;      /*用于有效性检查*/
    } FILE;

    在处理文件时,首先需要include将<stdio.h>嵌入到程序中,随后再定义一个指向FILE的指针,其格式为:FILR *<指针变量名>;

    例如:FILE *<fp>;在这里的fp是一个指向FILE结构体的指针变量,又称为文件指针。当将文件打开时,系统自动地创建一个FILE型结构体,用于存放文件的相关信息。在随后的各项操作中,程序将通过fp控制读写操作的位置。

    • 文件打开:<文件指针>=fopen(<文件名>,<操作模式>)。若文件打开成功,函数返回FILE型变量的地址;否则,返回NULL。例如:
    FILE *fp;
    if ((fp = open("c:\file.bat", "r")) == NULL){
    	printf("
    Cannot open the file");
    	return 1;
    }
    
    • 文件关闭:fclose(<文件指针>)。若关闭文件成功,函数返回0;否则,函数返回EOF。例如:fclose(<fp>);
    • 文件的读写操作:
    1. 字符读写函数——fgetc():用于从文件中读取一个字符;fputc():用于将一个字符写入文件中。
    2. 字符串读写函数——fgets():用于从文件中读取一个字符串;fputs():用于将一个字符串写入文件中。
    3. 数据块读写函数——fread():用于从文件中读取一个数据块;fwrite():用于将一个数据块写入文件中。
    4. 格式化读写函数——fscanf():用于从文件中读取一个格式化的数据块;fprintf():用于将一个格式化的数据块写入文件中。
    5. fgetc()标准函数的调用格式:<字符型变量>=fgets(<文件指针>);例如:ch=fgetc(fp);这条语句的基本功能是:从fp指向的文件中读取一个字符并将这个字符赋给char型变量ch。
    6. fputc()标准函数的调用格式:fputc(<字符>,<文件指针>);字符是将要写入文件中的内容。例如:fputc('a',fp);这条语句的基本功能是:将字符'a'写入文件指针fp所指的文本文件中。
    7. fgets()标准函数的调用格式:fgets(<字符数组>,n,<文件指针>);n:表示从文件中读取n-1个字符。
    8. fputs()标准函数的调用格式:fputs(<字符串>,<文件指针>);
    9. fread()标准函数的调用格式:fread(buffer,size,count,fp);buffer:是一个指针型变量,用于指示存放数据的位置;size:表示每个读块的字节数;count:表示待读的块数;fp:是文件指针。例如:fread(buffer,sizeof(int),5,fp);这条语句的基本功能是:从fp所指的文件中读取5块数据并放在buffer中,每块数据的大小为int类型占用的字节数。
    10. fwrite()标准函数的调用格式:fwriet(buffer,size,count,fp);buffer:是一个指针型变量,用于指示存放数据的位置;size:表示每个写块的字节数;count:表示待写的块数;fp:是文件指针。
    11. fscanf()标准函数的调用格式:fscanf(<文件指针>,<格式字符串>,<输入列表>);例如:fscanf(fp,"%d%f",&i,&j);这条语句的基本功能是:从fp所指的文件中按照格式控制的描述读取一个整型数值给i,一个单精度数值给j。
    12. fprintf()标准函数的调用格式:fprintf(<文件指针>,<格式字符串>,<输入列表>);
    • 联合体
    • 优点:可以提高存储空间的利用率,达到多个变量共享同一块存储空间的目的;可以降低程序设计的复杂度;可以提高程序的可理解性。
    • 定义联合体的语法格式:

    union <联合体类型名>

    {

      <成员列表>;

    };

    • 枚举类型
    • 特点:在定义类型的时候将所有可能的取值一一列举出来,这种类型的变量只能取得其中的某个值,这样就起到了很好的限定作用。
    • 优点:限制变量的取值范围;提高程序的可读性。
    • 枚举类型的值不能够直接地输入输出,只能间接地实现输入输出的操作。
    • 定义枚举类型的语法格式:enum <枚举类型名> {<枚举值列表>};
    • 例如:enum weekday {sun,mon,tue,wed,thu,fri,sat};

    本博客内容为原创,版权所有违者必究,转载请注明来源 http://www.cnblogs.com/sunshine-blog/ 

  • 相关阅读:
    09.Restful规范
    微信小程序 滚动插件 hSwiper2.0
    前端开发中代码仓库的团队使用(Github)
    hDProcess.js文档浏览进度插件
    Javascrtipt 基本排序算法
    NodeWebkit配置文件简介
    JavaScript中call,apply,bind方法的总结
    Javascript 闭包理解
    javascript常用知识点
    微信小程序 滚动插件 hSwiper
  • 原文地址:https://www.cnblogs.com/sunshine-blog/p/8370557.html
Copyright © 2011-2022 走看看