Linux C - C基础篇七(指针高级用法)
先简单介绍下结构体
C语言中结构体(Struct)从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由 int、char、float 等基本类型组成的。由于结构体将一组相关的变量看作一个整体而不是各自独立的实体,因此结构体有助于组织复杂的数据,特别是在大型的程序中,结构体非常常见。声明一个结构体的方式如下:
struct student {
char name[16];
int age;
int score;
};
如下,定义一个结构体变量,并通过"结构体变量名字.成员名字"的方式访问结构体变量里面的成员:
struct student stu;
stu.name = "张三";
stu.age = 15;
int a = stu.score;
结构体指针变量:结构体指针变量是指向结构体的指针,以上面的结构体为例,可以这样定义如下的结构指针变量:
struct student *stu1;
访问指针变量里面的成员,我们通常使用->,如下:
stu1->age = 15;
但是上面的操作是错误的,因为stu1是结构体指针变量,并没有指向某一块地址,也就是我们所谓的野指针,那么直接访问它是会导致段错误的,正确的做法是给这个指针变量赋值,让它指向另一个同类型的结构体地址:
stu1 = &stu; //stu是我们在上面定义的结构体变量,加上&表示取地址
stu1->age = 15;
或者通过调用库函数malloc申请一块大小为对应结构体大小的内存地址,赋值给结构体指针变量,然后就可以给结构体指针变量所指向的内存地址赋值:
stu1 = malloc(sizeof(struct strudent));
stu1->age = 15;
这种用法在内核代码中非常常见(Linux内核中使用kmalloc申请内存):
指针函数
指针函数本质是一个函数,只不过它的返回值是一个地址(指针),当我们调用这些函数的时候需要用同类型的指针变量来接收。例如:
char * strcpy(char *dest, const char *src);
int *func(int x,int y);
void *malloc(size_t size);
int *a = func(3, 5);
函数指针
函数指针本质是一个指针变量,只不过它指向的类型是一个函数,那么这个变量只能被一个函数赋值。如下,这种用法在内核中非常常见:
在结构体中定义函数指针:
给函数指针赋值:
总结:关于指针的应用在Linux中无论是应用层代码中还是kernel内核代码中应用都是非常普遍的,深入的理解指针不经能使自己写出高效的代码,更能让你非常容易的读懂大型项目中的代码。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
汽车防盗机相关文章:汽车防盗机原理 燃气报警器相关文章:燃气报警器原理