目录:
一、指针的基本概念;
二、指针测操作;
1.取地址&;
2.解引用*;
3.指针的运算;
4.指针的比较;
三、指针和数组;
1.一维数组和指针;
2.二维数组和指针;
3.多维数组和指针;
4.指针数组(注意重点是数组,指针在这里是一个修饰词);
5.数组指针(注意重点是指针,数组在这里是一个修饰词);
四、指针和函数;
1.指针函数(注意重点是函数,指针在这里是一个修饰词);
2.函数指针(注意重点是指针,函数在这里是一个修饰词);
五、指针和结构体
1.访问结构体成员的两种方式;
2.如何动态分配结构体内存空间;
六、指针和字符串
1.指向字符串的指针;
2.访问字符串中某个字符;
七、指针的高级应用
1.多级指针;
2.const指针;;
3.void指针;
4.野指针;
5.智能指针。
前言:
1.指针是C语言的核心和灵魂,c语言大型项目设计离不开指针。指针提供了一种直接访问内存中数据的方式,
使得C语言具有很高的灵活性和效率。
2.指针和指针变量:指针本身是一个抽象的概念,不过由于翻译,以及一些行业人员理解不深的缘故,将指针和指针变量混在一起,
然后我们可以看到各种书籍或者博客都是将指针变量当做指针这个字眼来描述,最后给很多初入行的从业人员带来了一些困扰。
3.指针变量是一个变量,只不过这个变量是用来存储变量的地址,也就是所谓的指针。在c语言中,指针可以实现函数参数的传递,
可以实现动态内存的分配,可以实现数组元素的操作等。
4.指针的比较是要求两个指针指向的是一块连续存储的地址,而不是随便两个指针就可以比较;
5.在单片机应用中,指针会被经常用到;
重点一:指针和一维数组以及二维数组之间关系
指针和一维数组
指针和二维数组之间关系
重点二:函数指针
注意函数指针和指针函数的区别;
函数指针的侧重点在于指针,函数只是用于修饰指针的;
eg: int (*func)(int,int);
指针函数的侧重点在于函数,指针只是用于修饰函数的;
eg:int* func(int,int);
具体函数指针的使用案例:
unsigned char(*func)(unsigned char,unsigned char);
unsigned char add(unsigned char v1, unsigned char v2) {
return (v1 + v2);
}
int main(void)
{
unsigned char a;
func = add;
a = func(1,2);
printf("a=%d\n",a);
return 0;
}
重点三:函数指针数组;
void (*func[3])(int,int);这个就是函数指针数组模型;
void func1();
void func2();
void func3();
void(*func[3])() = {func1,func2,func3};
方式二:
void(*func[3])();
void func1();
void func2();
void func3();
int main(void)
{
func[0] = func1;
func[1] = func2;
func[2] = func3;
return 0;
}
具体嵌入式应用案例:
enum LED {
LED1,
LED2,
LED3,
LED_SUM
};
void driver_led1(unsigned char status);
void driver_led2(unsigned char status);
void driver_led3(unsigned char status);
void(*driver_led[LED_SUM])(unsigned char) = { driver_led1,driver_led2,driver_led3};
void driver_led1(unsigned char status) {
if (status) {
printf("led1 on\r\n");
}
else {
printf("led1 off\r\n");
}
}
void driver_led2(unsigned char status) {
if (status) {
printf("led2 on\r\n");
}
else {
printf("led2 off\r\n");
}
}
void driver_led3(unsigned char status) {
if (status) {
printf("led3 on\r\n");
}
else {
printf("led3 off\r\n");
}
}
int main(void)
{
driver_led[LED1](1);
return 0;
}