入职培训笔记记录--day9(1、指针函数与函数指针、函数指针数组 2、malloc memset 3、递归函数 4、结构体 5、共用体---》大小端 6、枚举)

1、指针函数与函数指针、函数指针数组

指针函数:返回值为指针的函数

char *fun()
{
  char str[] = "hello world";
  return str;
}
 
int main()
{ 
  char *p = fun();
  puts(p);
  return 0;
}

编译时,会出现警告,返回了一个已经被释放掉的内存空间的首地址
解决方法:1、static
    2、char *str = "hello world";
    3、malloc 注意:使用完后要free并将指针置为NULL(相对于方法二,这个更加合理!str地址认为的去开辟不会干扰到正常进程)


typedef:给一个已有的类型取别名
typedef unsigned int size_t;
给unsigned int类型取个别名叫做size_t
unsigned int a;
size_t a;


>>>> malloc
void *malloc(size_t size);
功能:程序员手动在堆区申请内存空间
参数:size:需要申请的内存空间的大小(字节)
返回值:成功:申请到的内存空间的首地址
失败:NULL ---- 当内存不足时

 

>>>>memset
void *指针,作为形参,可以接收任何类型的指针
void *memset(void *s, int c, size_t n);
功能:设置内存空间的值,按照字节
参数:s---》要设置的内存空间的首地址
c---》要设置的值
n---》内存空间的大小 (字节)
返回值:设置好的内存空间的首地址

>>>>bzero
void bzero(void *s, size_t n);
功能:清空一片连续的内存空间
参数:s---》需要 清空的内存空间的首地址
n---》要清空的大小

>>>> void free(void *ptr);
功能:释放ptr指向的内存空间

 

>>>函数指针:指向函数的指针

 

int fun(int a);
int (*p)(int) = fun;


fun(10);
p(10);

  

 

注意:函数名为函数的入口地址
这个和数组指针很类似!

 

>>>函数指针数组
是数组,数组的元素为函数指针,指针指向函数
int (*p[4])(int, int);

 


>>>递归函数:自己调用自己----》展开

 

void fun(int i)
{
  if(i > 0)
  {
    fun(i/2);
  }
  printf("i = %d\n", i);
}

int main()
{ 
  fun(10);
  return 0;
}

 

  

 

 

 

 

4、结构体---》可以用来描述一个具体的事物
声明:struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
。。。。。。。。
};
声明结构体:主要是告诉编译器,有这么一个结构体类型(strcut 结构体名),一般是在main函数前面声明
定义结构体变量:strcut 结构体名 变量名;
访问结构体成员:结构体变量名.成员名;
>>>结构体指针---指向结构体变量的指针
int *p;
struct 结构体名 *p = &结构体变量名;
通过结构体指针访问成员:指针变量名->成员名;
>>>结构体数组
struct 结构体名 数组名[元素个数];
struct Table arr[3];

2、共用体---》大小端
特点:共用体的所有成员共同使用同一内存空间
共用体所占内存大小:占用内存空间最大的成员所占的内存大小
声明:union 共用体名
{
数据类型 成员名1;
数据类型 成员名2;
。。。。。。。。
};
定义共用体变量:union 共用体名 变量名;

大小端---》存储方式
大端存储:低字节数据存放在高地址,高字节数据存放在低地址
小端存储:低字节数据存放在低地址,高字节数据存放在高地址

3、枚举----》一般用作错误码的定义
enum 枚举名
{
成员1,
成员2,
成员3
};

 

 

 

 

 

 

 

 

 









 

 

 

 

 

 

 

 

 

posted @ 2017-03-02 23:53  AAAron  阅读(308)  评论(0编辑  收藏  举报