大家好,欢迎来到IT知识分享网。
指针与结构体
先简单介绍下结构体
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内核代码中应用都是非常普遍的,深入的理解指针不经能使自己写出高效的代码,更能让你非常容易的读懂大型项目中的代码。
以上是老韩关于Linux c基础指针的总结欢迎一起讨论,如有不足欢迎指点;对Linux c或者Linux驱动感兴趣的朋友可以收藏关注,我会持续更新的,谢谢支持!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/53818.html