const和void
const:常量化
const int a = 10;
int const a = 10;
<数据类型> const * 指针变量名 = 初始化值;
<数据类型> * const指针变量名 = 初始化值;
void:
数据类型
- 函数
void func(void)
{
}
- void* p;
void修饰的指针变量可以指向任何数据类型的指针
int *q;
char *l;
函数
- 概念
完成特定功能的代码块集合
- 函数应该关心的三大问题
[1]. 功能
[2]. 参数
[3]. 返回值
- 函数的一般定义形式
<数据类型> 函数名(<形参列表>)
{
代码块;
return [返回值];
}
-
函数的传参
-
赋值传参
-
地址传参
-
数组传参
[1]. 完成两个整型数据相加
[2]. 交换两个整型数据值
-
指针函数&函数指针
-
指针函数
返回值是指针的函数
一般定义形式:
<数据类型> * 函数名(<形参列表>)
{
代码块集合;
return 指针;
}
char *mystrcpy(char *dest, const char *src)
{
}
char *mystrcat(char *dest, const char *src)
{
}
- 函数指针变量
本质:指针变量
特点:该指针变量指向函数的地址
一般定义形式:
<数据类型>(*函数指针变量名)(<形参列表>);
<数据类型>(*)(<形参列表>);
[1].typedef
数据类型重命名
typedef int INT;
条件编译&函数宏
[1]. 条件编译作用
- 调试
- 头文件中使用,防止头文件重复包含
#include <stdio.h>
#include <head.h>
<head.h>
#ifndef _HEAD_H
#define _HEAD_H
#inclde <stdio.h>
void func(int,int);
#endif
- 增加代码的可移植性
#define 宏名
#ifdef 宏
xxxx
#endif
#ifndef 宏
xxxx
#endif
#ifdef 宏
xxxx
#else
xxxx
#endif
#if 0
xxxx
#endif
int max(int a,int b)
{
return a>b?a:b;
}
#define MAX(c,d) ((c)>(d)?(d):(d))
.....
.....
MAX(a,b);
.....
.....
MAX(a,b);
.....
MAX(a,b);
do{
...
}while(0)
一级指针
char a = 10;
char *p = &a;
printf("%d, %p, %p, %p", a, &a, p, &p);
printf("%d %d", *p, a);
野指针
防止野指针;赋值为空指针
【NULL】空指针
char *p = NULL;
【指针的运算】
+n 高地址方向移动n个数据元素;
-n 低地址。。。。
++ 高地址方向偏移1个数据元素;
-- 低地址。。。。
同等类型的指针间 - 法。 计算指针间相差几个同等类型的元素个数;
不同数据类型的两个指针实行加减整数运算是无意义的。
二级指针
一级指针(变量):变量的首地址
char a = 5;
char *p = &a;
&p 指针自己的存储空间地址
char **q;
**q = &p;
char **q = &p;
结构体
本质:数据类型(构造数据类型/自定义数据类型)
作用:修饰变量,确定变量在内存空间中的大小
结构体数据类型一般定义形式:
struct 数据类型名{
<成员变量>;
…
};
大小端:
大端:数据的高字节,存储在内存的低地址
小端:数据的高字节,存储在内存的高地址