1.fgets()函数

该函数是一个文件操作相关的函数

暂时使用这个函数可以从键盘上接收一个字符串,保存到数组中

char str[50];

1)scanf("%s",str);//缺点:不能接收空格,也是不安全的

2)gets(str);//优点:可以接收空格

        //缺点:会有一个警告,不安全的,比如数组的长度是50,我们输入的字符大于等于50的时候,会把50个字符全部放到数组中

        //没有空间存放字符串结束符

3)fgets是一个安全的字符串接收函数,比如数组的长度是50,我们输入的字符大于等于50的时候,会把前49个字符全部放到数组中,最后一个位置存放\0

使用格式:char *fgets(char *s,int n,FILE *fp);

fgets(数组名,数组长度,stdin);

当输入的字符串的长度小于数组长度的时候,fgets还会接收回车,回车后才是\0

2.fputs()函数

格式:fputs(数组名,stdout);

不会自动换行,也不能进行格式化输出

puts有换行

//
// main.c
// Fgets
//
// Created by fanyafang on 15/11/5.
// Copyright © 2015年 itcast. All rights reserved.
// #include <stdio.h>
#include <string.h> int main(int argc, const char * argv[]) {
char str[];
fgets(str,sizeof(str),stdin);
//把字符串后面的\n改为\0
//if(str[strlen(str)-1]=='\n') str[strlen(str)-1]='\0';
printf("---->%s\n",str); puts(str);//有换行
fputs(str,stdout);//无换行
return ;
}

3.const类型修饰符

常类型是指使用类型修饰符const说明的类型,常类型的变量或者对象的值是不能被更新的

1)修饰变量可以让变量的值不能改变

2)修饰指针变量,const在*的左侧,那么变量值不能改变;如果在* 的右侧,表示指向不能改变;如果在* 的两侧,表示两个都不能变

//
// main.c
// const使用
//
// Created by fanyafang on 15/11/5.
// Copyright © 2015年 itcast. All rights reserved.
// #include <stdio.h> int main(int argc, const char * argv[]) {
//1)修饰变量
const int a=;
printf("%d\n",a);
//a=34;报错,不能修改
//2)用指针强制修改变量
int *p=&a;
*p=;
printf("%d\n",a);//值不一样
printf("%d\n",*p);
printf("%p\n",&a);//地址一样
printf("%p\n",p);
//3)修饰指针变量,指向可以改变,指向的值不可以改变
int b=;
const int *p1=&a;
p1=&b; int const *p6=&a;
p1=&b; //4)const修饰的指针变量,指针变量指向的变量值可以变,指向不能变
int * const p3=&a;
*p3=;//指向的值可以变
//ps=&b;报错,指向不能变
//5)const修饰的指针变量,变量值和指向都不能变
const int * const p4=&a;
//*p4=12000;
//p4=&b; return ;
}

3.内存管理

1)内存分配方式

1))静态分配,在程序编译的适合就已经分配好,这块内存在程序的整个运行期都存在,例如全局变量,static变量

2))在栈上创建,在执行函数时,函数内局部变量的存储单元,效率很高,容量有限

3))从堆上分配,议程动态内存分配,程序在运行的时候用malloc或new申请任意多少的内存,手动用free或delete释放内存,灵活

2)内存分区

栈:运行时分配,局部变量

堆:运行时分配

BSS段:编译时分配,未初始化的全局变量和静态变量

数据区:编译时分配,已经初始化的全局变量和静态变量

代码段:编译时分配

3)动态分配内存函数:

1))viod * malloc(unsigned size);

#include <stdlib.h>

从内存的堆区分配大小为size个字节的联系的内存空间,如果内存分配成功,返回内存的首地址,失败,返回NULL。所以需要判断是否分配成功

2))calloc分配

calloc(块数,长度);

3))realloc函数可以给已经存在的空间扩充大小,返回新的地址

//
// main.c
// 分配内存
//
// Created by fanyafang on 15/11/5.
// Copyright © 2015年 itcast. All rights reserved.
// #include <stdio.h>
#include <stdlib.h> int main(int argc, const char * argv[]) {
//分配空间
//int *p=(int *)malloc(4*sizeof(int));
//使用一个函数给malloc申请的空间进行初始化
//memset(p,'a',16); int *p=(int *)calloc(, );//可以自动初始化 p=realloc(p, *sizeof(int));
if(p==NULL){
printf("申请失败!");
}else{
printf("申请成功!");
printf("%d\n",*p);
*p=;
*(p+)=;
*(p+)=;
*(p+)=;
*(p+)=;
printf("%d\n",*(p+));
} return ;
}

4.野指针和内存泄露

int *p=(int *)calloc(4, 4);//p存储在栈区,p指向的内容在堆区

在p被释放之前先要释放堆区中的内容,否则会造成内存泄露,释放之后要赋值为NULL,不然还是可以访问

//应该使用free函数释放内存空间
free(p);//释放后p是一个野指针
//p=NULL;
*p=;

5.指针函数:返回值是指针类型的函数

//
// main.c
// 指针函数
//
// Created by fanyafang on 15/11/5.
// Copyright © 2015年 itcast. All rights reserved.
// #include <stdio.h> char * printDay(int n){
char * days[]={
"星期一",
"星期二",
"星期三",
"星期四",
"星期五",
"星期六",
"星期日"
};
return n>&&n<?days[n-]:"输入错误";
} int main(int argc, const char * argv[]) {
int n=;
printf("请输入一个数字:\n");
scanf("%d",&n);
printf("%s\n",printDay(n)); return ;
}

6.函数指针

在C语言中,一个函数总是占用一段连续的内存空间,而函数名就是该函数所占内存空间区的首地址

定义函数指针:int (*p)(int a , int b );或者:int (*p)(int  , int  );

函数指针的使用:

调用函数,同函数名的使用,可以任意调用函数

C语言回顾-内存管理和指针函数的更多相关文章

  1. C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针

    C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针 (1)开辟的内存没有释放,造成内存泄露 (2)野指针被使用或释放 (3)非法释放指针 (1)开辟的内存没有释放.造成内存泄露,以下的样 ...

  2. JVM内存管理------JAVA语言的内存管理概述

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...

  3. JVM内存管理之JAVA语言的内存管理概述

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...

  4. C语言的内存管理

    C语言的内存管理 转载:http://blog.csdn.net/wind19/article/details/5964090   对于一个C语言程序而言,内存空间主要由五个部分组成代码段(.text ...

  5. R语言之内存管理

    转载于:http://blog.csdn.net/hubifeng/article/details/41113789 在处理大型数据过程中,R语言的内存管理就显得十分重要,以下介绍几种常用的处理方法. ...

  6. C语言讲义——内存管理

    动态分配内存 动态分配内存,在堆(heap)中分配. void *malloc(unsigned int num_bytes); 头文件 stdlib.h或malloc.h 向系统申请分配size个字 ...

  7. C#高级编程9 第14章 内存管理和指针

    C#高级编程9 内存管理和指针 后台内存管理 1) 值数据类型 在处理器的虚拟内存中有一个区域,称为栈,栈存储变量的浅副本数据,通过进入变量的作用域划分区域,通过离开变量的作用域释放. 栈的指针指向栈 ...

  8. c语言之内存管理

    在计算机系统,特别是嵌入式系统中,内存资源是非常有限的.尤其对于移动端开发者来说,硬件资源的限制使得其在程序设计中首要考虑的问题就是如何有效地管理内存资源.本文是作者在学习C语言内存管理的过程中做的一 ...

  9. C语言精华——内存管理,很多学校学习不到的知识~

    在编写程序时,通常并不知道需要处理的数据量,或者难以评估所需处理数据量的变动程度.在这种情况下,要达到有效的资源利用--使用内存管理,必须在运行时动态地分配所需内存,并在使用完毕后尽早释放不需要的内存 ...

随机推荐

  1. 基于Spring + Spring MVC + Mybatis + shiro 高性能web构建

    一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详 ...

  2. ssh项目部署到weblogic中问题总结

    部署到weblogic还是比较费劲的 ,不过基本上问题全是由于classloader顺序的问题引起的. 首先在web-inf底下添加weblogic.xml文件如下 <?xml version= ...

  3. Weblogic部署项目三种方式

    在weblogic中部署项目通常有三种方式:第一,在控制台中安装部署:第二,将部署包放在domain域中autodeploy目录下部署:第三,使用域中配置文件config.xml 进行项目的部署. 控 ...

  4. 不安装Oracle客户端使用PLSQL连接Oracle数据库的方法

    1,下载PL\SQL http://dl8.cr173.com/soft1/PLSQLDeveloper10_ha.zip(这个是我下载的,带破解和汉化); 2,下载完后傻瓜式安装 ,这里说下,1是P ...

  5. 读书笔记 —— 《css秘密花园》

    浏览器兼容性有效性信息查询 : Can I Use? http://caniuse.com/ 自动为css添加浏览器厂商前缀 https://autoprefixer.github.io/ 在线编辑H ...

  6. 关于malloc函数的动态分配问题

    malloc函数动态分配了一个整型的内存空间,让abc都指向刚申请的空间,所以只有最后一个赋值语句的值保留在了空间里 #include<stdio.h> main() { int *a,* ...

  7. XSS漏洞

    跨站脚本攻击(也称为XSS)指利用网站漏洞从用户那里恶意盗取信息 坚决不要相信任何用户输入并过滤所有特殊字符.这样既可消灭绝大部分的XSS攻击.另一个建议是输出页面时将 < 和 > 变换成 ...

  8. mysql_索引原理及优化

    思考: 我们知道mysql最好的数据存储量级是百万级别,是的往往在百万级别或者几十万级别就会出现慢查询(我对慢查询的定义是大于1秒),几年前我所在的一个做pos机支付的联机交易的核心系统组,当时就做过 ...

  9. Tomcat常见问题汇总

    1.在服务器上一定要开启-server参数 #直接在一堆注释下添加即可 #即是在 # OS specific support.注释之前 JAVA_OPTS= -server 2.tomcat启动很慢  ...

  10. 理解AX InventTrans的几种状态

    接触AX一段时间后,发现InventTrans表非常重要.它可以说是物流模块的核心,开发BI报表的话必须依赖此报表.   先来看官方释义: InventTrans表包含了库存交易的信息.当销售/采购订 ...