结构体指针定义及使用

结构体指针

一、先回顾一下结构体的定义及其使用:
1、结构体的定义形式如下:
struct 结构体名
{
类型1 成员1;
类型2 成员2;

类型n 成员n;
};
实例如下:

struct stu
{
	char* name;
	int age;
	int num;
};

2、该结构体的使用范例如下所示:

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

struct stu//定义一个结构体
{
	char* name;
	//char name[10];
	int age;
	int num;
};

int main(void)
{
	struct stu s;//定义一个结构体变量s
	s.name = "Bob";//给结构体变量s赋值
	//strcpy(s.name,"Bob");//如果把name定义为一个数组则使用该语句赋值
	s.age = 22;
	s.num = 6;

	printf("name=%s\n", s.name);//输出结构体变量s的内容
	printf("age=%d\n", s.age);
	printf("num=%d\n", s.num);

	return 0;
}

二、结构体指针的定义及使用
1、结构体指针的定义:
struct 结构体名 *指针变量名;
实例如下:

struct stu//先定义一个结构体
{
	char* name;
	int age;
	int num;
};

struct stu s1,*s;//定义一个结构体变量和一个结构体指针

2、该结构体的使用范例如下:

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

struct stu//定义一个结构体
{
	char* name;
	//char name[10];
	int age;
	int num;
};

int main(void)
{
	struct stu s1,*s;//定义一个结构体变量和一个结构体指针
	s = &s1;//让指针s指向结构体变量s1,就是将s1的首地址赋予指针s
	s->name = "Bob";//赋值
	//strcpy(s->name,"Bob");//如果把name定义为一个数组则使用该语句赋值
	s->age = 22;
	s->num = 6;

	printf("name=%s\n",s->name);//输出内容
	printf("age=%d\n", s->age);
	printf("num=%d\n", s->num);

	return 0;
}
<think>我们正在讨论C语言中的结构体指针定义初始化方法。根据引用内容,结构体指针定义包括两个步骤:定义结构体类型声明指向该结构体类型的指针变量。初始化则是将指针指向一个已存在的结构体变量(或数组元素)的地址,或者动态分配内存。参考引用:-引用[1]给出了结构体指针定义初始化示例:先定义一个结构体stu,然后定义一个结构体变量stu1并初始化,最后定义结构体指针pstu并初始化为stu1的地址。-引用[2]展示了结构体定义(Student)但没有直接展示指针初始化。-引用[3]说明了结构体指针可以指向结构体数组的第一个元素。我们将按照以下步骤讲解:1.定义结构体类型2.声明结构体指针3.初始化结构体指针(指向已存在变量或动态分配内存)同时,我们会提供两个示例:一个是指向已存在的结构体变量,另一个是指向动态分配的内存。在回答中,我们需要注意LaTeX格式(行内用$...$,独立公式用$$...$$),但当前问题不涉及数学公式,所以主要注意代码展示引用标注。最后,按照要求生成相关问题。</think> ### C语言结构体指针定义与初始化详解 #### **一、结构体指针定义** 结构体指针用于存储结构体变量的内存地址,语法格式为: ```c struct 结构体名称 *指针变量名; ``` - `struct` 是关键字,不可省略 - 指针变量名前必须有`*`符号 - 结构体必须先定义才能声明指针[^1][^2] **示例定义**: ```c struct Student { // 定义结构体类型 int id; char name[50]; float gpa; }; struct Student *pStu; // 声明结构体指针 ``` #### **二、初始化方法** ##### 1. 指向已存在的结构体变量 ```c struct Student stu1 = {101, "Alice", 3.8}; // 创建结构体变量 struct Student *p = &stu1; // 将指针初始化为变量地址[^1] printf("学号: %d\n", (*p).id); // 传统访问方式 printf("姓名: %s\n", p->name); // 推荐箭头操作符 ``` ##### 2. 指向结构体数组元素 ```c struct Student class[3] = { {201, "Bob", 3.5}, {202, "Cathy", 3.9}, {203, "David", 4.0} }; struct Student *pArr = class; // 指针指向数组首地址[^3] for(int i=0; i<3; i++){ printf("GPA: %.1f\n", (pArr+i)->gpa); // 指针算术运算访问 } ``` ##### 3. 动态内存分配初始化 ```c struct Student *pNew = (struct Student*)malloc(sizeof(struct Student)); // 成员初始化 pNew->id = 301; strcpy(pNew->name, "Emma"); pNew->gpa = 3.7; free(pNew); // 使用后必须释放内存 ``` #### **三、核心操作语法** 1. **成员访问运算符**: - `(*指针).成员名` - `指针->成员名`(更简洁的等效写法)[^2] 2. **指针运算**: ```c p++; // 移动到下一个结构体(偏移量=sizeof(struct Student)) ``` #### **四、注意事项** 1. **内存安全**: - 指针初始化前禁止访问(避免野指针) - 动态分配内存必须配对`malloc/free` 2. **结构体对齐**: - `sizeof(struct Student)`通常大于成员大小之 - 使用`offsetof`宏获取成员偏移量 3. **常量指针**: ```c const struct Student *pConst; // 禁止通过指针修改结构体 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值