C语言中结构体与指针的若干问题(在数据结构中的应用)
程序员文章站
2022-08-09 18:54:24
【 注】:
在讲下面的东西之前,先讲几个易错的东西,
1.sizeof 这个东西看起来像是函数,其实不是就是一个运算符,求字节的。
int a = sizeof(int);
这里就求出来了int型占...
【 注】:
在讲下面的东西之前,先讲几个易错的东西,
1.sizeof 这个东西看起来像是函数,其实不是就是一个运算符,求字节的。int a = sizeof(int);
这里就求出来了int型占用的是4个字节(这里依据个人电脑版本不同会有出入,我的是win7 64位)。
2. define 这个就是给一个东西起一个新的名字例如
#define maxn 100
那么以后在使用maxn这个的时候它代表的就不是字符串了,而是100.也可以用来定义函数
#define max(x, y) x > y ? x : y
3.typedef
这个其实和上一个很像。这个东西在学习数据结构的时候经常出现,
例如当大家第一次看到elemtype sqlist()
{
...
...
}
的时候会觉得这elemtype是什么类型,都没看过.
这时大家就可以在书的最前面找到
typedef int elemtype;
这里代表的就是给 int 起一个别名,叫做elemtype.
在数据结构中这么做是为了调bug的时候很方便。好了基础的铺垫就讲这么多。
一、首先什么是结构体:
大家都知道数据类型吧,int 整形, char 字符型, float 单精度 , double 双精度, 等等都是c语言等其他高级语言自带的数据类型。
数组就是用户自己定义的数据类型,结构体 struct 也是用户自己定义的数据类型。
example:
int a[maxn]; //maxn 之前定义为10
那么这个a数组可以存储10个整形的元素
char b[maxn];
那么这个b数组可以存储10个字符型的元素
那么如果我想在一个数组里存储不同类型的元素怎么办。
这里就设计了一个好的数据类型---->struct 结构体。
结构体可以把已经有的不同的数据类型或用户定义的结构型。
example
typedef struct
{
int a;
char c;
float c;
}typea;
这是一个新的数据类型,typea型。
具体调用可以这样使用:
typea.a = 10;
typea.b = 'a';
typea.c = 1.8;
...
...
...
还可以用这个定义数组
typea m[3];
这时每个数组的元素都有了三个属性。
m[0].a = 20;
m[0].b = 's';
m[0].c = 4.5;
...
...
...
以上就是结构体的使用,各位小伙伴懂了吗?
二、接下来是指针
指针和结构体一样,都是数据类型,只不过指针型变量内部装的是变量的地址。
共过它可以找出这个变量在内存中的位置,就像一个指示方向的指针,指出了某个变量的位置,
因此叫做指针型。
定义规则:
int *a; //指向整形变量的指针
char *b; //指向字符型变量的指针
float *c; //指向浮点型变量的指针
typea *d; //指向typea型变量的指针
...
...
...
这里可以对比一下直接定义int等....
如果a是个指针型变量,且它已经指向一个变量b,则a中存放的变量b所在的地址。
*a就是取变量b的内容(x = *a; 等价于x = b;)
&b就是取变量b的地址。
a = &b;就是把变量b的地址放在变量a中。
三、结构体与指针的混用
如链表的定义:
typedef struct node
{
int data; //这里默认的是int型,如需要其他类型可直接修改
struct node *next; //指向node型变量的指针
}node;
二叉树的定义:
tyedef struct btnode
{
int data;
struct btnode *lchild;
struct btnode *rchild;
}btnode;
还可以
tyedef struct btnode
{
int data;
struct btnode *lchild;
struct btnode *rchild;
}btnode, *btnode;
这里多了一个*btnode.
在定义一个结点指针p的时候,
btnode *p; 与 btnode p;等价
这里的使用还不同。
btnode.data = 10;
(*btnode)->data = 10;
大家看出区别没,
如果前面btnode定义的是普通的变量调用就是” . “
如果是指针类型的就是->.
基本就是这些不太容易懂得,也欢迎各位补充。
大家懂了吗?