结构体基础全家桶(2)结构体指针

2023-12-17 05:23:04

目录

指向结构体类型数据的指针:

指向结构体变量的指针:

创建:

应用:

注意事项:

指向结构体数组的指针

创建:

应用:

注意:

用结构体变量和指向结构体的指针做函数的参数

注意:

下期预告:结构体的内存对齐


雨过终有天晴,不是吗

在前面我们已经了解了普通变量指针,数组指针,函数指针。指针的合理运用可以让我们的程序运行更加高效,代码的数量得到有效的减少。这里我们来讲解结构体的指针:

如果对指针不是太了解,也可以看一下这篇关于指针的文章:

【小白都爱的指针入门理解 】http://t.csdnimg.cn/IOpzx

指向结构体类型数据的指针:

一个结构体变量的指针就是改变量所占据的内存短的起始地址。我们可以设置一个指针来指向结构体的其实位置地址,同时也可以用来指向结构中的元素。

指向结构体变量的指针:

创建:

与普通指针的创建方式一样,我们需要先声明指针的类型“struct student",接着表明这是一个指针
?
struct student {

	int age;
	char name[20];
	int num;

}student1;
int main()
{
	struct student* p1 = &student1;

	return 0;
}

应用:

我们可以通过指针来给结构体进行初始化,以及对结构体的成员值进行改变:
int main()
{
	struct student* p1 = &student1;
	(*p1).age = 100;
	(*p1).name[0] = 's';
	(*p1).num = 200;

	return 0;
}

注意事项:

  • 在对结构体成员中的数组赋值时我

    们要找到最低单位,也就是要找到数组中的单个元素,不能对数组整体赋值。
  • 因为运算优先级” .”?要大于” * “,这里的()不能省去。
  • 这里的(*p).可以用p->来代替,->为指向运算符

指向结构体数组的指针

先前我们已经介绍过,指针可以指向普通变量数组。同样指针也可以指向结构体数组,两者具有相似性。

创建:

方法与上述方法相同:
struct student {

	int age;
	char name[20];
	int num;

}arr[3] = {
	{10,"haha",100},
	{20,"lili",200},
	{30,"hehe",300}
};//定义结构体数组

int main()
{
	struct student* p = &arr;//创建


	return 0;
}

应用:

这里依旧要准寻找到最小单位的准则!
int main()
{
	struct student* p = &arr[0];//创建
	printf("%d\n", (*p).age);
	p++;
	printf("%d\n", (*p).age);

	return 0;
}

运行结果:

10
20

注意:

  • 这里&arr指向数组中第一个元素的地址。
  • 这里p++会跳过一个结构体指向下一个结构体,而不是指向原结构体下一个元素。
  • p已经被程序定义为指向struct student 类型数据的指针,它只能指向结构体类型,而不能指向结构体中的单个元素。

用结构体变量和指向结构体的指针做函数的参数

将一个结构体变量的值传参我们这里介绍两种:

1.结构体成员传参,将结构体的单个成员的值传入:

int add(int a)
{
	return 2 * a;
}
struct student {

	int age;
	char name[20];
	int num;
}student1={10,"asdf",300};
int main()
{
	int m = add(student1.age);

	return 0;
}

2.结构体地址传参:

void pff(int* p)
{
	*p = (*p) * 2;
}
int main()
{
	
	int* p = &(student1.age);
	pff(p);
	printf("%d\n",*p);
	return 0;
}

注意:

传值与传址两者的区别,传值并不会改变原本值的大小,而传址将会改变原本变量值的大小。

这里我们打印出来的值为20!

这篇文章到这里就结束了,如果感觉不够了解,可以回顾上期文章:

【结构体基础全家桶(1)创建与初始化 】http://t.csdnimg.cn/8n2kP

下期预告:结构体的内存对齐

文章来源:https://blog.csdn.net/2301_79383371/article/details/135029440
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。