学习笔记6-C语言内存管理+构造类型

原创 2015年11月19日 14:18:32

1常见动态内存分配函数

使用之前导入头文件stdlib.h

1) malloc

void  *malloc(unsigned size)

作用是在堆区分配一个大小为size的连续空间,如果成功返回新分配内存的首地址否则返回null。在使用新内存之前必须判断是否分配成功。

 

申请空间       int *p=(int *)malloc (4*sizeof(int)); 分配空间强制类型转换

使用    if(p!=NULL){

  //正常使用空间

}else{ 

//空间分配失败处理

}

注意 malloc 申请的内存空间,如果不赋值 存的是随机数。

 memset (地址,‘a’size) 把地址后的size长度的字符都设置为字符a

2) calloc按块分配

int *p=(int *) calloc(块数,块数大小);

申请的空间也是连续的,如果不赋值 初始化为0。

3) relloc (扩充原内存)

p =relloc(原内存地址p,新的内存大小);、

扩充内存时,如果内存不够用,会重新寻找一块足够大的连续内存,把新内存地址返回。

4) 野指针和内存泄漏

野指针是没有指向的指针。

解决方法:给指针初始化为NULL,使用之后再次赋值为NULL或者释放。

内存泄漏:指针释放了,内存没有释放。

解决方法:在释放指针之前,先释放内存空间。

                        free(p)。

                       同时将p的指针赋值为 NULL,避免野指针。

2 指针函数

概念:返回值为指针的函数。

类型说明符 * 函数名(形参列表){

函数体

}

       函数体中返回返回值的地址。

注意值传递和地址传递。

 

使用举例

输入一个1-7 的值返回星期

<span style="font-size:14px;"><span style="white-space:pre">	</span>char * getDay(int n){
<span style="white-space:pre">	</span>char *days[]={
<span style="white-space:pre">	</span>“monday”,
<span style="white-space:pre">	</span>“tuesday”,
<span style="white-space:pre">	</span>“wednesday“,
<span style="white-space:pre">	</span>“thursday“,
<span style="white-space:pre">	</span>“friday“,
<span style="white-space:pre">	</span>“saturday“,
<span style="white-space:pre">	</span>“sunday“
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>return  0<n<8?days[n]:”输入有误”;  //返回days[n]字符串的首地址。否则返回字符串“输入有误的首地址“。
<span style="white-space:pre">	</span>}</span>


3 函数指针

指向函数的指针。

1) 函数指针定义:  返回值类型  (*函数指针名)(形参列表);

                 int (*p)(int x,int y);

        2)普通函数定义  返回值类型 函数名sum(形参列表){

              函数体;

}

       int sum(int x ,int  y){

return x+y;

}

         3)函数指针的初始化:p=sum; //函数名sum是该函数的首地址。

              注意

初始化时函数指针的返回值类型和形参列表与函数必须一致。

定义函数指针的时候可以不写形参名,但是必须写形参类型。

4)函数指针的使用。

              可以把p当sum使用

              sum(3,4);

              p(3,4);

              (*p)(3,4);  //取值调用

注意

 p是一个指针变量,通过对p的重新赋值可以使p获得其他函数的首地址,调用其它函数。

 函数指针不能算术运算。


4 构造类型

       构造数据类型是根据已定义的一个或者多个数据类型用构造方法定义。

构造类型的值可以分解为一个基本数据类型或者一个构造类型。

 

数组是一个数据类型相同的构造类型。

结构体是数据类型多元化的构造类型。

 

1)结构体定义:

struct 结构名{

成员变量列表;     //成员变量之间用分号分隔

}; //此处有分号

struct student{

       char  *name;

       int   class;

       float  score;

};

 

2) 结构体变量

定义

a 先定义结构体,再定义结构体变量

struct  student stu1;

b 定义结构体的同时定义结构体

struct 结构体名{

        成员变量

}结构体变量1,结构体变量2;//逗号间隔,分号结束

c 匿名结构体

struct  {

        成员变量

}结构体变量1,结构体变量2;//逗号间隔,分号结束

 

结构体变量的成员访问

 

结构体变量名.结构体成员变量

stu1.name

 

结构体变量的初始化

a 先定义结构体后初始化

stu1.name=”xiaoming”

b 定义结构体的同时初始化

struct student stu1={“xiaoming”,9,59.5};

c 指定元素初始化

struct student stu1={.name=”xiaoming”};

3)结构体变量的存储原理

   数据成员对齐作用

        简化处理器与内存之间传输系统的设计

        提升数据的读取速度。

结构体存储的大小是各个成员变量字节和(考虑对齐问题)

4)结构体的作用域 全局和局部

 

5)结构体数组

 

结构体数组的定义

和结构体变量定义方法一样。只不过是一个结构体数组。

 

结构体数组的初始化

a  定义的同时初始化

         struct student{

               成员变量

stu[5]={{ },{ },{ }};

b 先定义后初始化

struct student{

               成员变量

};

student stu[3]={{},{},{}};

c 先定义的后初始化,整体赋值

  struct student stu[3];

  stu[0]=(struct student){  ,  ,  };

d 先定义数组后,点方法赋值

       stu[0].name=”ss”;

 

6)结构体指针

       指向结构体变量的指针

定义 struct  student *pstu;

                struck student stu=NULL;

      初始化赋值  pstu=&stu;


结构体指针间接访问变量的值

       (*结构体指针).成员变量

         结构体指针->成员变量

7)结构体嵌套


8)结构体与函数参数

       成员值作为函数的参数。 和普通实参类似,值传递。

       结构体变量作为函数参数。类似数组,会给形参分配空间,把实参值赋值给形参变量,值传递。

              void xx(sructstudent stu){  };

      结构体指针作为函数参数。类似指针,地传递。

              void xx(sruct  student * pstu){  };

 

 enum  weekday{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};

5 枚举类型

枚举类型是基本数据类型,值不可以分解。

定义

       enum 枚举类型名 {

               枚举值列表     //逗号分隔

}

 

       

      使用

            enum 枚举类型名  枚举变量名;

       枚举变量的值

             打印值 :printf(“%d”,枚举变量名);

              默认第0个枚举值为0,依次+1.

             如果手动赋值,其后的值为当前值累加1。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

学习笔记2-C语言的运算符和程序结构

一  运算符 1 运算符及分类   运算符是特定的算术或者逻辑符号。   1)按功能分类 算术运算符、关系运算符、逻辑运算符和按位运算符。 2)按操作数的个数分类 单目运算符、双目运算...

学习笔记4-C语言数组和字符串

数组的基本概念及分类       数组:把具有相同类型的若干变量安装有序的形式组织起来。这些按序排列的同类型数据的集合称为数组。        数组元素:构成数组的数据。每个数组元素有相...

学习笔记9-OC入门基础

1     import 引入头文件 可以防止重复包含 include 需要预处理指令。 2     NSLog    参数的是NSString 类型对象 print...

C语言中Union类型的使用方法

使用C语言时,常常使用struct,对于union类型却几乎没有用过,只知道它是联合类型,各字段共享一块内存,实际应用中却不知道它的具体用途。 今天读《编程卓越之道》中看到有对其使用的简单介绍,记录...
  • feimor
  • feimor
  • 2011-10-10 10:32
  • 6739

学习笔记3-C语言函数进制

函数的概述   C语言程序是由函数组成的。函数是C程序的基本模块,通过函数模块的调用实现特定的功能。 函数的优点:提高程序的可读性,提高开发效率和提高代码的重用性。   1函数分类 ...

(C语言)共用体union的用法举例

以前在学校学习C语言的时候一直搞不懂那个共用体union有什么用的。工作之后才发现它的一些妙用,现举例如下:1. 为了方便看懂代码。比如说想写一个3 * 3的矩阵,可以这样写:[注:下面用红色部分标记...

自适应滤波

对于一些事先并不知道所需要进行操作的参数的应用,例如一些噪声信号的特性,要求使用自适应的系数进行处理。在这种情况下,通常使用自适应滤波器,自适应滤波器使用期望和反馈来综合调整滤波器系数以及频率响应。常...

联合体(union)的使用方法及其本质

6.本质&进阶: 根据union固定首地址和union按最大需求开辟一段内存空间两个特征,可以发现,所有表面的定义都是虚的,所谓联合体union,就是在内存给你划了一个足够用的空间,至于你怎么玩~它...

学习笔记10-OC类的特性

1     NSString 类 处理字符串的类。 1) 创建常量字符串 NSString  *str =@”abc“;  //str 为指针变量  ”abc“为字符串常量    &...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)