博客专栏

EEPW首页 > 博客 > Linux C - C基础篇七(指针高级用法)

Linux C - C基础篇七(指针高级用法)

发布人:嵌入式Linux 时间:2023-01-12 来源:工程师 发布文章
指针与结构体

先简单介绍下结构体

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内核代码中应用都是非常普遍的,深入的理解指针不经能使自己写出高效的代码,更能让你非常容易的读懂大型项目中的代码。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

汽车防盗机相关文章:汽车防盗机原理
燃气报警器相关文章:燃气报警器原理


关键词: 指针

相关推荐

技术专区

关闭