欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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定义的是普通的变量调用就是” . “
如果是指针类型的就是->.

基本就是这些不太容易懂得,也欢迎各位补充。

大家懂了吗?