1 动态内存

  比如声明数组得时候,我们需要提前预估数组长度,分配大了浪费,少了就更不好操作了。从而引入动态分配,需要的时候再分配。

(1)malloc和free

  void *malloc(size_t size)

  void free(void *pointer)

  注意需要对每个malloc返回的指针进行检查,确保不是NULL。

(2)calloc和realloc

  malloc和callo得区别是后者在返回指向内存的指针之前把它初始化位0

  void *calloc(size_t num_elements,size_t element_size)

  realloc用于修改一个原先已经分配好的内存块大小

  void realloc(void *ptr,size_t new_size)

(3)动态内存分配得用法

  比如想足够存储25个整数的内存

    pi=malloc(25*sizeof(int))

(4)小技巧之malloc宏定义

#include <stdlib.h>

//如果程序偶尔调用malloc 程序由于错误无法编译

#define malloc 不要直接使用malloc

//接受元素得数目以及每种元素得类型 计算总共需要的内存字节数。alloc调用malloc并检查,确保返回的指针不是NULL

#define MALLOC(num,type) (type *)alloc((num)+sizeof(type))

#include "alloc.h"

#undef malloc

void* alloc(size_t size)

{

void * new_mem;

new_mem=malloc(size);

if(new_mem==NULL)

   {

printf("out of memory!\n");

    exit(1);

}

  return new_mem;

}

2 预处理器

(1)预定义符号

  __FILE__:文件的文件名

  __LINE__:文件当前行的行号

  __DATA__:文件被编译的日期

  __TIME__:文件被编译得时间

  这几个常用于debug输出

  #define DEBUG_PRINT printf("FILE %s line %d:"\

      "x=%d,y=%d,z=%d",\

       __FILE__,__LINE__,\

     X,Y,Z)

(2)#define

  #define name stuff

    每当符号name出现在这条指令后面时,预处理器就会把它替换成stuff,当然,替换文本不仅限于数值字面值chagnl,也可以如下

  #define reg register

  #define do_forever for(;;)

  #define CASE break;case;

  常见错误

    #define SOUARE(X)  X*X

    a=5

    printf("%d\n",SOUARE(a+1))//11 不是36哦,实际上是a+1*a+1

(2)#和##

  #:可以将宏参数转换为一个字符串

    #define PRINT(FORMAT,VALUE)   \

         printf("the value of" #VALUE  \

        " is " FORMAT "\n",VALUE)

    PRINT("%d",x+3)

  ##它是位于它两边的符号链接成一个符号

(3)#undef

  这条预处理指令用于移除一个宏定义

(4)条件编译

  可以选择代码的一部分被正常编译还是完全忽略

  #if statement    #if DEBUG

    staement      printf("x=%d,y=%d\n",x+y)

  #endif       #endif

            如果要使用 就应该使用#defnie DEBUG 1

(5)文件包含

  本地包含:使用“ ” 例如#include “a.h”

  函数库文件:使用<>  例如#include <stdio.h>在linux中通常去/usr/include查找

  注意:

    为了避免头文件重复包含

      #ifndef __a__h

      #define __a__h 1

      #endif

  

<c和指针>学习笔记5动态内存分配和预处理器的更多相关文章

  1. C++学习笔记(十一):void*指针、类型转换和动态内存分配

    void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void ...

  2. C和指针 第十一章 动态内存分配

    声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...

  3. C和C指针小记(十六)-动态内存分配

    动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. ...

  4. 深入理解C指针----学习笔记

      深入理解C指针     第1章 认识指针   理解指针的关键在于理解C程序如何管理内存,指针包含的就是内存地址.     1.1 指针和内存   C程序在编译后,以三种方式使用内存: 1. 静态. ...

  5. C++的智能指针学习笔记(初)

    C++ primer plus 16.2节介绍了auto_ptr,该模板类在C++11中已弃用,目前已被shared_ptr代替. auto_ptr又叫做智能指针,用于管理动态内存分配的用法. 为什么 ...

  6. C++学习 之 指针及动态内存分配(笔记)

    1. 指针 1.1 指针的含义: 简单来说,指针是存储内存地址的变量.当我们声明了一个指针变量后,使用该指针时系统会根据指针内的地址索引内存块,读取内存内的值.指针因为是用来存地址的,所以一般固定长度 ...

  7. [C++学习笔记14]动态创建对象(定义静态方法实现在map查找具体类名对应的创建函数,并返回函数指针,map真是一个万能类)good

    [C++学习笔记14]动态创建对象   C#/Java中的反射机制 动态获取类型信息(方法与属性) 动态创建对象 动态调用对象的方法 动态操作对象的属性 前提:需要给每个类添加元数据 动态创建对象 实 ...

  8. 《C和指针》 读书笔记 -- 第11章 动态内存分配

    1.C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放,这些函数维护一个可用内存池. void *malloc(size_t size);//返回指向分配的内存块起始位置的 ...

  9. C语言学习笔记--动态内存分配

    1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名. ①内存分配由编译器在编译期间决定 ②定义数组的时候必须指定数组长度 ③数组长度是在编译期就必须确 ...

随机推荐

  1. 【leetcode刷题笔记】Remove Duplicates from Sorted List II

    Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...

  2. 【Flask模板】include标签

    # include标签:1. 这个标签相当于是直接将指定的模版中的代码复制粘贴到当前位置.2. `include`标签,如果想要使用父模版中的变量,直接用就可以了,不需要使用`with context ...

  3. 【并查集】关押罪犯(BSOJ2809)

    Description S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨 气值”(一个正整 ...

  4. hd acm1005

    问题: 已知递推公式:f[i] = ( a * f[i-1] + b * f[i-2] ) % 7,f[1]=1,f[2]=1. 需要你输入三个数a,b,n.其中a,b用来补充上述公式,用补充后的公式 ...

  5. php获取图片的拍摄及其他数据信息

    服务器配置说明:1.在php.ini文件中找到;extension=php_exif.dll,去掉前面的分号2.在php.ini文件中找到;extension=php_mbstring.dll,去掉前 ...

  6. Delphi操作XML - 冰雪傲骨

    Delphi操作XMl,只要使用 NativeXml.我是用的版本是4..NativeXML的使用方法比较简单,但是功能很强大. XE2的话,要在simdesign.inc后面加上: // Delph ...

  7. Educational Codeforces Round 30D. Merge Sort

    归并排序的逆操作,每次二分时把第二段第一位与第一段最后一位开始往前第一个比它大的数交换位置 可以用归并排序验证答案对不对 #include<bits/stdc++.h> #define f ...

  8. WCF之契约的分类(部分為參考他人)

    什么是契约呢?在使用WCF时,对其制定各种各样的规则,就叫做WCF契约.任何一个分布式的应用程序在传递消息的时候都需要实现制定一个规则. 任何一个分布式应用程序,它之所以能够互相传递消息,都是事先制定 ...

  9. javaScript-进阶篇(三)

    1.Window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法: 2.JavaScript 计时器 在JavaScript中,我们可以在设定的时间间隔 ...

  10. OpenCV-Python 霍夫直线检测-HoughLinesP函数参数

    cv2.HoughLines()函数是在二值图像中查找直线,cv2.HoughLinesP()函数可以查找直线段. cv2.HoughLinesP()函数原型: HoughLinesP(image, ...