嵌入式系统学习Day14(C语言中指针的拓展)
一.二级指针
如果要保存的是一个一级指针变量所在空间的的地址那就可以写为:char * *p;
int a = 10; //整型变量 对应要开要给4字节空间 有空间 就有地址
int * p = &a; //p也是变量(一级指针变量) 是变量 就有空间 有空间 就有地址
int* * q = &p; //q也是变量(二级指针变量) 是变量 就有空间 有空间 就有地址
int** *r = &q; //三级指针
r //r中放的是 q的地址
*r //就相当于是q q中放的就是 p的地址
**r //*q 相当于p p中放的是 a 的地址
***r //*p 相当于a 就是a中的值 10
二.堆区空间
特点: 大
手动申请,手动释放
函数
void *malloc(size_t size);
功能:
堆区申请空间
参数:
@size 表示申请的大小
返回值:
成功 返回申请到的堆区空间的地址
失败 NULL
void free(void *ptr);
功能:
释放堆区的空间
参数:
@pstr 之前用malloc申请到的堆区空间的地址
NULL //空指针
void * //空类型指针
//万能指针
// 表示可以接收任意类型的指针
注意:
如果通过 void *类型的地址 进行解引用操作
会报错,
如果要用,必须转换为 具体的类型
//int*
*p //解引用
eg:
int a[10];
要求,定义一个数组,放在堆上
输入10个值,输出
三.函数指针
int add(int a,int b)
{
return a + b;
}
add //函数名 --- 代表的是函数的入口地址
//函数名是标识符
//函数也是一种类型
//去掉标识符 --- 剩下就是标识符对应的数据类型
//int (int a,int b) --- 函数类型 --- 表示是一类函数 ,返回值为int型 ,带有两个int型形参这么一类函数
void *p = add;
int (*p) (int,int) = add; //定义了一个指向 函数 的 指针
函数回调
main函数的参数:
const char *s[] = {"hello","world","china"};
const char * argv[] //数组 --指针数组 ---const char *
const char ** arg //编译器最终理解的形式
int main(int argc,const char *argv[])
argc 命令行参数的个数
argv 表示命令参数对应字符串的 一个指针数组
四.指针函数
//指针(的)函数 --- 本质 ---函数---只是 返回值是指针类型而已
表示 返回值类型 为指针类型的函数
char * strcpy
char * strcat
注意:
1.函数可以返回地址
但是,不能是局部变量(auto--栈上)的地址,auto的局部变量的生命周期 随着函数调用开始存在,函数调用结束销毁
2.局部变量想要返回值地址
static