首页 > 其他分享 >C语言结构体指针

C语言结构体指针

时间:2023-11-06 17:34:40浏览次数:32  
标签:struct pstu int C语言 score 指针 结构

C语言结构体指针

当一个指针变量指向结构体时,称它为结构体指针。C语言结构体指针的定义形式一般为:
struct 结构体名 *变量名;
下面是一个定义结构体指针的实例:

//结构体
struct stu{
  char *name;//姓名
  int num;//学号
  int age;//年龄
  char group;//所在小组
  float score;//成绩  
}stu1 = {"Tom", 12, 18, 'A', 136.5};
//结构体指针
struct stu *pstu = &stu1;

也可以在定义结构体的同时定义结构体指针:

struct stu{
  char *name;
  int num;
  int age;
  char group;
  float score;
}stu1 = {"Tom", 12, 18, 'A', 123;}, *pstu = &stu1;

注意,结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&,所以给结构体指针变量pstu赋值只能写作:struct stu *pstu = &stu1;

还应注意,结构体和结构体变量是两个不同的概念,结构体是一种数据类型,是一种创建变量的模板,编译器不会给它分配内存空间,就像int、float、char这些关键字本身不占用内存一样,结构体变量才包含实实在在的数据,才需要内存来存储。不可能去取一个结构体名的地址,也不能将它赋值给其他变量。

  • 获取结构体成员
    通过结构体指针可以获取结构体成员,一般形式为:
    *(pointer).memberName;或者pointer->memberName;
    .的优先级高于*(*pointer)两边的括号不能少。->是一种新的运算符,称为“箭头”,可以通过结构体指针直接获取结构体成员;这也是C语言中唯一的用途。

实例1:

#include<stdio.h>
int main(){
	struct {
		char *name;
		int num;
		int age;
		char group;
		float score;
	}stu1 = {"Tom", 12, 18, 'A', 123.5}, *pstu = &stu1;
	printf("%s 's num:%d, age:%d, in %c group, score:%.lf!\n",(*pstu).name, (*pstu).age, (*pstu).group, (*pstu).score);
	printf("%s 's num:%d, age:%d, in %c group, score:%.lf!\n",pstu->name, pstu->age, pstu->group, pstu->score);
	return 0;
}

结果显示:

实例2:结构体数组指针的使用

#include <stdio.h>
struct stu{
	char *name;
	int num;
	int age;
	char group;
	float score;
}stus[] = {
	{"Zhou ping", 15, 18, 'C', 130.0
	},
	{"Zhang ping", 2, 12, 'A', 123.0
	},
	{"Liu ping", 23, 13, 'D', 110.9
	},
	{"Wang ping", 13, 32, 'B', 133.9
	}

},*ps;

int main(){
	int len = sizeof(stus)/sizeof(struct stu);
	printf("Name\tNum\tAge\tGroup\tScore\t\n");
	for (ps=stus;ps<stus+len;ps++){
		printf("%s\t%d\t%d\t%c\t%.lf\n",ps->name,ps->num, ps->age,ps->group,ps->score);
	}
	return 0;
	
}

结果:

  • 结构体指针作为函数参数
    结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换为一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。
    实例:计算全班学生的总成绩、平均成绩和以及 140 分以下的人数。:
#include <stdio.h>
struct stu{
	char *name;
	int num;
	int age;
	char group;
	float score;
	
}stus[] = {
	{"Zhou ping", 15, 18, 'C', 130.0
	},
	{"Zhang ping", 2, 12, 'A', 123.0
	},
	{"Liu ping", 23, 13, 'D', 110.9
	},
	{"Wang ping", 13, 32, 'B', 133.9
	}

};

void avg(struct stu* ps, int len);

int main(){
	int len = sizeof(stus)/sizeof(struct stu);
	avg(stus, len);
	return 0;
	
	
}

void avg(struct stu *ps, int len){
	int i, num = 0;
	float average, sum = 0;
	for (i=0;i<len;i++){
		sum+=(ps+i)->score;
		if((ps+i)->score<140){
			num++;
		}
	}
	printf("sum=%.2f\naverage=%.2f\n<140 person num=%d\n",sum,sum/5,num);
}

结果显示:

标签:struct,pstu,int,C语言,score,指针,结构
From: https://www.cnblogs.com/bonne-chance/p/17813243.html

相关文章

  • SQLserver、MYSQL、Oracle复制表结构和数据语句
    1.SQLserver语法select*into新表名from旧表名;2.mysql语法CREATETABLE新表名SELECT*FROM旧表;Oracle语法CREATETABLE新表ASSELECT*FROM旧表;......
  • 实验二 C语言分支与循环基础应用
    1.实验11#include<stdio.h>2#include<stdlib.h>3#include<time.h>45#defineN56#defineN13747#defineN246589intmain()10{11intnumber;12inti;1314srand(time(0));1516for(i=......
  • 数据结构与算法-数组
    什么是数组在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据数组的特点低效的插入和删除数组为了保持内存数据的连续性,会导致插入......
  • 数据结构之排序
    一.什么是稳定排序?排序后相等元素的相对位置不发生变化二.稳定排序有哪些?2.1.不稳定排序:快速排序、希尔排序、堆排序2.2.稳定排序:冒泡排序、插入排序、归并排序、基数排序三.各大排序算法3.1.稳定算法3.1.1.冒泡排序思想:通过两两比较不断将最大的数浮出水面。一次浮出一......
  • cf1322BPresent(基数排序+双指针+拆位)
    cf1322BPresent首先拆位是显然的,对于两个数a[i],a[j],除了考虑当前位上的数,我们还要考虑是否会产生进位,我们可以利用基数排序+双指针,因为我们每次都是将低位的排好序了,所以我们可以用双指针计算进位,然后分类计算一下,当前为为1的情况即可。#include<cstdio>#include<algorithm>#......
  • 面向结构编程
    面向结构的编程是一种基于任何协议都可以被结构替换这一事实的范例。这种方法的优点是性能。由于面向结构的方法基于使用静态调度的结构,因此面向协议的方法中的调度速度将与动态调度的协议显着不同。在面向结构的方法中,泛型和闭包有助于提供抽象。 ......
  • 无线局域网(802.11体系结构和协议栈)
    无线LAN越来越普及,家庭、办公室、咖啡厅、图书馆、机场、动物园等公共场所都有相应的设施,通过它们可以把就计算机、PDA和智能手机连接到Internet。无线局域网也可用来使得附近的两台或多台计算机直接进行通信而无须接入Internet。无线局域网的主要标准是802.11。在以下内容中,我们......
  • 数据结构的基本概念和术语
    数据(Data)数据:能输入计算机且能被计算机处理的各种符号的集合,信息的载体能被计算机识别,存储和加工包括:数值型的数据:整数,实数等  非数值型的数据:文字,图像,声音等;2.数据元素和数据项数据元素:是数据的基本单位,在计算机程序......
  • 实验三 类与指针、数组
    1#pragmaonce2#include<iostream>34usingstd::cout;56usingstd::endl;78classPoint{910public:11Point(intx0=0,inty0=0);12~Point()=default;13intget_x()const;14intget_y()const;15vo......
  • 实验三:类与数组、指针。
    实验任务11#pragmaonce23#include<iostream>4usingstd::cout;5usingstd::endl;67classPoint{8public:9Point(intx0=0,inty0=0);10~Point()=default;1112intget_x()const;13intget_y()const;14......