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

c语言中结构体指针

程序员文章站 2024-01-22 13:15:58
1、指向结构体的指针变量: c 语言中->是一个整体,它是用于指向结构体,假设我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到指向...
1、指向结构体的指针变量:
c 语言中->是一个整体,它是用于指向结构体,假设我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到指向运算符“->”.


举例说明:
struct sunll
{
int a;
int b;
int c;
};

struct sunll * p; //定义结构体指针
struct sunll a = {1,2,3}; //定义一个sunll类型的变量a

int x; //定义一个变量x
p = &a ; //让p指向a
x = p->a; //等价于 x=(*p).a (*p)表示p指向的结构体变量
//这句话的意思就是取出p所指向的结构体中包含的数据项a赋值给x
//由于此时p指向a,因而 p->a == a.a,也就是1

2、指向结构体数组的指针变量:
指向结构体的指针变量也可以指向结构体数组及其元素。


如果程序如下:
struct sunll *p,sun[3];
p = sun;
如果假定sun[0]的地址是1000,指针变量p指向结构体数组sun的首地址,由于size of(struct sunll)的值是6,每个结构体元素占内存空间6个字节,因此p+1指向地址1006,p+2指向地址1012.

使用指针变量指向结构体变量或结构体数组时,应注意运算符的优先级,在中() [ ] -> .四个优先级相同,具有最高的优先级,其次是”*“ ”++“ ”--“ ”&“四个相同优先级的运算符。如:++p->a的表达式等价于++(p->a)

(++p)->a先计算++p,p指向sun[1];
p++->a;则表达式等价于(p++)->a;
p->a++的表达式等价于(p->a)++;

3、结构体作为函数参数与结构体指针作为函数参数


举例1
struct st
{
int a;
char b;
};

fun(struct st bc)
{
bc.a+=5;
bc.b='a';
printf(%d,%c ,bc.a,bc.b);
}

main()
{
struct st bl;
bl.a=3;
bl.b=c;
fun(bl);
printf(%d,%c ,bl.a,bl.b);
}

运行结果为:8,a 3,c

举例2:
struct st
{
int a;
char b;
};

fun(struct st *bp)
{
bp->a+=5;
bp->b='a';
printf(%d,%c ,bc.a,bc.b);
}

main()
{
struct st bl;
bl.a=3;
bl.b=c;
fun(&bl);
printf(%d,%c ,bl.a,bl.b);
}

运行结果为:8,a 8,a

总结:
将结构体变量作为函数参数,是将实参值传递给形参,属于值传递。将结构体所有参数传递给形参使用,但本身的值不会改变。将指向结构体变量的指针作为实参进行传递时,是将结构体变量的地址传递给形参,属于地址传递,会改变实际结构体变量的成员值的。