结构体数组,结构体指针

结构体数组

定义一个结构体数组和定义一个普通的数组差不多,表示有括号里面这么多个相同的结构体,只不过里面的成员各不相同。遍历结构体数组的方式也是使用变量ifor循环来遍历:下面是表达方法和遍历的方法:

#include<stdio.h>

struct Test
{
	int data;
	char cdata;
};
int main()
{
	struct Test array[2] = {
	{10,'A'},	//这是第一个元素的成员
	{20,'B'}};	//第二个
	int i,len;
	
	len = sizeof(array)/sizeof(array[0]);
	for(i=0;i<len;i++){
		printf("%d,%c",array[i].data,array[i].cdata);	//用下标来遍历
	}
	return 0;
}

结构体指针

指针就是地址,指针变量就是存放地址的变量,结构体也是变量,也能定义一个结构体类型的指针来保存结构体的首地址。当然访问变量也有两种方法:1.变量名;2.地址。

#include <stdio.h>

struct Test
{
	int data;
	char cdata;
};
int main()
{
	struct Test t = {10,'A'};
	struct Test *p = &t;

	printf("%d,%c\n",t.data,t.cdata);		//通过变量名来访问里面的数据
	printf("%d,%c\n",p->data,p->cdata);		//通过地址来访问里面的数据
	return 0;
}

用结构体指针保存结构体数组

定义一个结构体指针来保存一个结构体数组的首地址,并通过for循环和i变量和指针偏移来遍历结构体数组:

#include <stdio.h>

struct Test
{
	int data;
	char cdata;
};
int main()
{
	struct Test array[3] = {{10,'A'},{20,'B'},{30,'C'}};	//定义三个结构体的成员
	struct Test *p = array;
	int i;
	int len;
	
	len = sizeof(t)/sizeof(t[0]);	//计算数组长度
	for(i=0;i<len;i++){
		printf("%d,%c\n",p->data,p->cdata);
		p++;	//指针的便偏移
	}
	return 0;
}

例子:用结构体指针写一个选票系统

前提:有3个人候选,分别写入3个候选人的名字,有5个人投票,输入候选人的名字就可以为其投一票,最后输出每个人有多少票,有多少人弃投。

#include<stdio.h>
#include<string.h>

struct XuanMin
{
	char name[32];
	int ticket;
};

int main()
{
	struct XuanMin xm[3];	//定义一个结构体数组,三位候选人
	struct XuanMin *p = xm;	//定义一个指针指向结构体数组首地址
	struct XuanMin max;		//定义一个最多票数的结构体变量
	int i,j;
	int len=sizeof(xm)/sizeof(xm[0]);
	int total=5;	//5个人投票
	char tmpName[32];
	int mark;
	int f=0;
	
	
	//输入候选人的名字
	for(i=0;i<len;i++){
		p->ticket=0;
		printf("请输入候选人的名字。\n");
		scanf("%s",p->name);
		p++;
	}
	p = xm;	//把全部人名输入到各自的结构体中之后,把指针指回结构体数组的开头
	
	//唱票环节
	for(i=0;i<5;i++){ //5个人投票,一共有5票
		mark=0;      //每一次进行判断mark有没有为0,在这里输入很关键
		printf("你要投的名字。\n");
		memset(tmpName,'\0',sizeof(tmpName)); //每次要初始化为\0,才能清空上一个人的名字,输入下一个人的名字,避免潜在的逻辑错误
		scanf("%s",tmpName);
		p = xm;  //回到数组头
		
		for(j=0;j<len;j++){		//输入要投的候选人之后,开始在三位候选人里面招名字
			if(strcmp(tmpName,p->name) == 0){
				p->ticket++;
				mark = 1;
			}
			p++;
		}
		if(mark == 0){
			printf("没有该候选人,当作弃票。\n");
			f++;	//弃票加1
		}
	}
	
	max = xm[0];
	p = xm;		//5人投完票得到每一位候选人的票数之后,回到数组头
	for(i=0;i<len;i++){
		if(max.ticket < p->ticket){
			max = xm[i]; 
		}
		p++;
	}
	
	p = xm;		//回到数组头,重头遍历
	for(i=0;i<len;i++){
		printf("%s有%d票\n",p->name,p->ticket);
		p++;
	}
	printf("恭喜%s以%d票当选!!!\n",max.name,max.ticket);
	printf("有%d人弃票\n",f);
	return 0;
}
在C语言中,结构体数组指针是一种非常有用的数据结构,它允许通过指针高效地访问和操作结构体数组中的元素。以下是关于结构体数组指针的使用方法及其相关概念。 ### 结构体数组的定义与初始化 结构体数组是由多个相同类型的结构体变量组成的集合。例如: ```c struct Book { char name[10]; int price; }; int main() { struct Book books[3] = { {"CProg", 50}, {"Maths", 45}, {"Physics", 40} }; return 0; } ``` 上述代码定义了一个包含三个`Book`结构体变量的数组,并对其进行了初始化。 ### 指向结构体数组指针 为了更高效地操作结构体数组,可以使用指向结构体数组指针结构体指针可以通过地址运算来访问数组中的各个元素。例如: ```c struct Book { char name[10]; int price; }; int main() { struct Book books[3] = { {"CProg", 50}, {"Maths", 45}, {"Physics", 40} }; struct Book *ptr = books; // 指向数组首元素的指针 for (int i = 0; i < 3; i++) { printf("Name: %s, Price: %d\n", ptr->name, ptr->price); ptr++; // 移动到下一个结构体元素 } return 0; } ``` 在这个例子中,`ptr`是一个指向`Book`结构体指针,通过递增指针(`ptr++`),可以遍历整个结构体数组[^2]。 ### 使用指针访问结构体成员 当使用指针访问结构体成员时,可以使用`->`运算符。例如: ```c struct Book { char name[10]; int price; }; int main() { struct Book book; struct Book *ptr = &book; strcpy(ptr->name, "CProg"); // 使用 -> 访问结构体成员 ptr->price = 50; printf("Name: %s, Price: %d\n", ptr->name, ptr->price); return 0; } ``` 在这个例子中,`ptr->name`等价于`(*ptr).name`,但使用`->`更加简洁和直观。 ### 结构体数组指针的应用场景 结构体数组指针在需要高效处理大量数据时非常有用。例如,在动态内存分配中,可以使用`malloc`或`calloc`为结构体数组分配内存,并使用指针进行访问: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> struct Book { char name[10]; int price; }; int main() { int n = 3; struct Book *books = (struct Book *)malloc(n * sizeof(struct Book)); if (books == NULL) { printf("Memory allocation failed.\n"); return -1; } strcpy(books[0].name, "CProg"); books[0].price = 50; strcpy(books[1].name, "Maths"); books[1].price = 45; strcpy(books[2].name, "Physics"); books[2].price = 40; struct Book *ptr = books; for (int i = 0; i < n; i++) { printf("Name: %s, Price: %d\n", ptr->name, ptr->price); ptr++; } free(books); // 释放内存 return 0; } ``` 在此示例中,`books`是一个动态分配的结构体数组,通过指针`ptr`对其进行访问和操作[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值