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的内容显示输出的方法如下:
- for (ptr=iarray,i=0;i<20;i++) printf("%d",*(ptr+i));
- for (ptr=iarray;ptr<array+20;ptr++) printf("%d",*ptr);
- 指针与数组实例:从键盘输入一个文本行,统计其中包含的空格和非空格字符的数量
- #include<stdio.h>
- #pragma warning(disable:4996)
- #define NUM 80
- main()
- {
- char textline[NUM];
- char *s;
- int charnum = , spacenum = ;
- printf("enter a string:");
- gets(textline);
- for (s = textline; *s != '\0'; s++){
- if (*s == ' ')
- spacenum++;
- else
- charnum++;
- }
- printf("\n%d characters and %d space in string", charnum, spacenum);
- }
- 指针与字符串
- 计算字符串长度
- int strlen(char *s)
- {
- int len = 0;
- for (; *s != '\0'; 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) != '\0'){
- 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可执行文件。
- 文件被划分成两个类别:文本文件、二进制码文件
- 文本文件:以字符为基本单位,每个字符占用一个字节存放对应的ASCII,这种文件形式又被称为ASCII文件;
- 二进制文件:指直接按照二进制编码形式存储数值的方式,在文件中将直接存储这个二进制数值
- 针对文件的访问,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("\nCannot open the file");
- return 1;
- }
- 文件关闭:fclose(<文件指针>)。若关闭文件成功,函数返回0;否则,函数返回EOF。例如:fclose(<fp>);
- 文件的读写操作:
- 字符读写函数——fgetc():用于从文件中读取一个字符;fputc():用于将一个字符写入文件中。
- 字符串读写函数——fgets():用于从文件中读取一个字符串;fputs():用于将一个字符串写入文件中。
- 数据块读写函数——fread():用于从文件中读取一个数据块;fwrite():用于将一个数据块写入文件中。
- 格式化读写函数——fscanf():用于从文件中读取一个格式化的数据块;fprintf():用于将一个格式化的数据块写入文件中。
- fgetc()标准函数的调用格式:<字符型变量>=fgets(<文件指针>);例如:ch=fgetc(fp);这条语句的基本功能是:从fp指向的文件中读取一个字符并将这个字符赋给char型变量ch。
- fputc()标准函数的调用格式:fputc(<字符>,<文件指针>);字符是将要写入文件中的内容。例如:fputc('a',fp);这条语句的基本功能是:将字符'a'写入文件指针fp所指的文本文件中。
- fgets()标准函数的调用格式:fgets(<字符数组>,n,<文件指针>);n:表示从文件中读取n-1个字符。
- fputs()标准函数的调用格式:fputs(<字符串>,<文件指针>);
- fread()标准函数的调用格式:fread(buffer,size,count,fp);buffer:是一个指针型变量,用于指示存放数据的位置;size:表示每个读块的字节数;count:表示待读的块数;fp:是文件指针。例如:fread(buffer,sizeof(int),5,fp);这条语句的基本功能是:从fp所指的文件中读取5块数据并放在buffer中,每块数据的大小为int类型占用的字节数。
- fwrite()标准函数的调用格式:fwriet(buffer,size,count,fp);buffer:是一个指针型变量,用于指示存放数据的位置;size:表示每个写块的字节数;count:表示待写的块数;fp:是文件指针。
- fscanf()标准函数的调用格式:fscanf(<文件指针>,<格式字符串>,<输入列表>);例如:fscanf(fp,"%d%f",&i,&j);这条语句的基本功能是:从fp所指的文件中按照格式控制的描述读取一个整型数值给i,一个单精度数值给j。
- fprintf()标准函数的调用格式:fprintf(<文件指针>,<格式字符串>,<输入列表>);
- 联合体
- 优点:可以提高存储空间的利用率,达到多个变量共享同一块存储空间的目的;可以降低程序设计的复杂度;可以提高程序的可理解性。
- 定义联合体的语法格式:
union <联合体类型名>
{
<成员列表>;
};
- 枚举类型
- 特点:在定义类型的时候将所有可能的取值一一列举出来,这种类型的变量只能取得其中的某个值,这样就起到了很好的限定作用。
- 优点:限制变量的取值范围;提高程序的可读性。
- 枚举类型的值不能够直接地输入输出,只能间接地实现输入输出的操作。
- 定义枚举类型的语法格式:enum <枚举类型名> {<枚举值列表>};
- 例如:enum weekday {sun,mon,tue,wed,thu,fri,sat};
本博客内容为原创,版权所有违者必究,转载请注明来源 http://www.cnblogs.com/sunshine-blog/
c语言程序设计案例教程(第2版)笔记(四)—指针、分配存储空间、文件的更多相关文章
- c语言程序设计案例教程(第2版)笔记(二)—函数、递归
零散知识点 模块化:将一个问题分解成若干个子问题的过程成为模块化. 模块化的优点:不但可以将一个复杂的问题分解成几个相对简单的问题:还可以提高程序代码的重用性. 函数:函数是构成C程序的基本单位.函数 ...
- c语言程序设计案例教程(第2版)笔记(六)—字符串处理实例
字符串处理 功能描述:从键盘输入一个文本行后,为用户提供菜单选择,实现字符串一些操作——显示文本行.查找并替换指定子串.删除指定子串.统计指定子串数目. 实现代码: #include<stdio ...
- c语言程序设计案例教程(第2版)笔记(五)-软件开发基础知识
零散知识点: 软件的主要特征 软件是一种逻辑产品,而不是有型的物质: 软件需要设计.开发,但不是传统意义上的产品制造: 软件不会磨损,但软件需要维护,即:修改代码或增加模块: 虽然软件行业正在向基于组 ...
- c语言程序设计案例教程(第2版)笔记(三)—变量、结构体
零散知识点: 变量 :C语言中,每个变量必须先定义后引用.所谓变量存在是指系统为这个变量分配一块存储空间,此时对变量的操作,就是对变量所对应的存储空间中存放的数据进行操作.人们将变量占据 ...
- c语言程序设计案例教程(第2版)笔记(一)—零散、输入输出、最小公倍数、选择排序、冒泡排序
零散知识点: 非格式化输入输出:getchar().putchar() 格式化输入输出 :scanf().printf() 字符串输入输出 :gets() 或 scanf().puts() 或 ...
- 0031 Java学习笔记-梁勇著《Java语言程序设计-基础篇 第十版》英语单词
第01章 计算机.程序和Java概述 CPU(Central Processing Unit) * 中央处理器 Control Unit * 控制单元 arithmetic/logic unit /ə ...
- C语言学习书籍推荐《C语言程序设计 现代方法(第2版)》下载
下载地址:点我 C语言仍然是计算机领域的通用语言之一,但现在的C语言已经和当初的时候大不相同了.本书主要的一个目的就是通过一种“现代方法”来介绍C语言,书中强调标准C,强调软件工程,不再强调“手工优化 ...
- 全国计算机等级考试二级教程-C语言程序设计_第8章_地址和指针
面试: unsigned int *p1 = # int *p2 = # #define _CRT_SECURE_NO_WARNINGS #include<std ...
- Python基础教程(第3版) 笔记(二)
1.8模块Python提供了完成(某人的年 龄为32.9,并想将这个值向下圆整为32,因为他还没有满33岁)这种任务的函 数floor.导入模块,可以使用特殊命令import.函数floor包含在模块 ...
随机推荐
- 过滤器链chain.doFilter(request,response)含义
过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用. 过滤 过滤器的大多 ...
- 【scrapy】创建第一个项目
1)创建项目命令: scrapy startproject tutorial 该命令将在当前目录下创建tutorial文件夹 2)定义Item Items are containers that wi ...
- CentOS 7下安装Logstash ELK Stack 日志管理系统(上)
介绍 The Elastic Stack - 它不是一个软件,而是Elasticsearch,Logstash,Kibana 开源软件的集合,对外是作为一个日志管理系统的开源方案.它可以从任何来源,任 ...
- 【C/C++学院】0901-设计模式的汇总演练
备忘录模式 数据库的备份,文档编辑中的撤销等功能 #include <iostream> #include <string> #include <vector> u ...
- Ubuntu使用adb连接android手机失败unknown的解决的方法
Ubuntu使用adb连接android手机失败unknown的解决的方法 Ubuntu下通过USB数据线连接G11手机后,adb可能无法识别到设备.依照一下步骤能够解决此问题. 1.在termi ...
- 项目期复习总结1:背景图合并,hack,浏览器内核前缀,伪类after before
文件夹: 1.背景图合并和CSS Spirit 2.PS基本快捷键 3.hack技术基本书写,为什么不用? 4.内核前缀 5.伪类afterbefore 1.背景图合并和CSS Spirit 背景图合 ...
- 搭建Maven私服(使用Nexus)
搭建私服能够做什么? 1.假设公司开发组的开发环境所有内网.这时怎样连接到在互联网上的Maven中央仓库呢? 2.假设公司常常开发一些公共的组件.怎样共享给各个开发组.使用拷贝方式吗?假设这样,公共库 ...
- MySQL 温故而知新--Innodb存储引擎中的锁
近期碰到非常多锁问题.所以攻克了后,细致再去阅读了关于锁的书籍,整理例如以下:1,锁的种类 Innodb存储引擎实现了例如以下2种标准的行级锁: ? 共享锁(S lock),同意事务读取一行数据. ? ...
- 【iOS进阶】UIWebview加载搜狐视频,自动跳回客户端 问题解决
UIWebview加载搜狐视频,自动跳回搜狐客户端 问题解决 当我们用UIWebview(iOS端)加载网页视频的时候,会发现,当真机上有搜狐客户端的时候,会自动跳转到搜狐客户端进行播放,这样的体验对 ...
- oracle的日期蛋
一切都是扯鸡巴蛋. 在网上查oracle的日期函数用法,得到一大堆语法,林林总总,都是扯鸡巴蛋,没能解决我的问题. 其实,我想写这么一条语句:查找某个日期(不含时分秒)产生或有关的记录.咋写? SQL ...