6.C++之结构体

学习目标:

1.结构体的定义与基本语法

2.结构体数组

3.结构体指针

4.结构体嵌套

5.结构体做函数参数

6.结构体中const使用场景-防止无操作


学习内容:

1.结构体的定义与基本语法

结构体属于用户自定义的数据类型,允许用户存放不同的数据类型。
一个结构体一般分为两步:

  • 定义结构体
    语法: struct 结构体名{结构体成员列表}
  • 创建变量
    • 创建变量方法1:struct 结构体名 变量名
    • 创建变量方法2:struct 结构体名 变量名={成员1,成员2,……}
    • 创建变量方法3:定义结构体时顺便创建变量

代码演示

//定义结构体
struct Student 
{
string name;
int age;
}
//创建方法1
struct Student s;
s.name = "Jcak";
s.age = 18;
//创建方法2
struct Student s = {"Jack",18}
struct Student 
{
string name;
int age;
}s;//直接在结构体后面注明

2.结构体数组

语法: struc 结构体名 数组名[元素个数]={{},{},{},……}

#include<iostream>
#include<string>
using namespace std;
struct Student
{
	string name;
	int age;
};//注意该处有分号
int main()
{
	struct Student s[2] = {
		{"Jack",18},
		{"Tom",28}
	};
	//遍历结构体数组
	for (int i = 0; i < 2; i++)
	{
		cout << "姓名:" << s[i].name<<"\t";
		cout << "年龄:" << s[i].age << endl;
	};
	system("pause");
	return 0;
}

在这里插入图片描述

3.结构体指针

利用指针来访问结构体中的成员
利用操作符->来访问结构体属性

struct Student
{
string name;
int age;};
//创建结构体变量
struct Student s = {"Jack", 18};
//通过指针指向结构体变量
struct student *p = &s;
//通过指针来访问结构体变量中的数据
p->name;//姓名
p->age;//年龄
#include<iostream>
#include<string>
using namespace std;
struct Student
{
	string name;
	int age;
};//注意该处有分号
int main()
{
	struct Student s = {
		"Tom",28
	};
	struct Student* p = &s;
	cout << "姓名" << p->name << "\t" << "年龄:" << p->age << endl;
	system("pause");
	return 0;
}

4.结构体嵌套

结构体嵌套就是一个结构体作为另一个结构体的成员。
案例描述:定义一个老师(姓名)的结构体,在老师这个结构体中包含着学生这个结构体(姓名,年龄,学号)。

#include<iostream>
#include<string>
using namespace std;
struct Student
{
	string name;
	int age;
	string id;
};//注意该处有分号
struct Teacher
{
	string name;
	struct Student s;
};
int main()
{
	struct Teacher T;
	T.name = "王老师";
	T.s = { "小张",18,"001" };
	cout << T.name << "带的学生是:" << T.s.name << endl;
	cout << T.s.name << "的年龄为:" << T.s.age << ",学号为:" << T.s.id << endl;
	system("pause");
	return 0;
}

在这里插入图片描述

5.结构体做函数参数

将结构体作为参数向函数中传递,主要有值传递和地址传递。

值传递
#include<iostream>
#include<string>
using namespace std;
struct Student
{
	string name;
	int age;
	string id;
};//注意该处有分号

void PrintStudent(struct Student s)
{
	cout << "姓名为:" << s.name << "\t年龄:" << s.age << "\t学号:" << s.id << endl;
};
int main()
{
	struct Student s={"Jack",18,"007"};
	PrintStudent(s);
	system("pause");
	return 0;
}

在这里插入图片描述

地址传递(传入地址,用指针接收)
#include<iostream>
#include<string>
using namespace std;
struct Student
{
	string name;
	int age;
	string id;
};//注意该处有分号

void PrintStudent(struct Student *p)
{
	cout << "姓名为:" << p->name << "\t年龄:" << p->age << "\t学号:" << p->id << endl;
};
int main()
{
	struct Student s={"Jack",18,"007"};
	PrintStudent(&s);
	system("pause");
	return 0;
}

在这里插入图片描述

6.结构体中const使用场景-防止无操作

地址传递可以节省内存空间,使用const来防止误操作,以免形参的改变影响实参变化
在传值中,传入的是地址,用指针来接收,在接收前加上一个const,使其不能进行赋值操作。

#include<iostream>
#include<string>
using namespace std;
struct Student
{
	string name;
	int age;
	string id;
};//注意该处有分号
void PrintStudent(const struct Student *p)
{
	//p->age = 15;//加入const后,在对其赋值,程序会报错!!!
	cout << "姓名为:" << p->name << "\t年龄:" << p->age << "\t学号:" << p->id << endl;
};
int main()
{
	struct Student s={"Jack",18,"007"};
	PrintStudent(&s);
	system("pause");
	return 0;
}

<think>好的,我现在需要解决在Visual Studio中使用点号对结构体成员赋值时报错的问题。首先,我得回忆一下用户提供的引用内容,看看有没有相关的信息。 用户提到在引用[4]中有一个结构体的例子,老师结构体包含学生结构体,并且在main函数中使用点号进行赋值,比如t.stu.age = 20;。这说明在正常情况下,VS是支持用点号对结构体成员赋值的。但用户现在遇到了报错,可能是什么原因呢? 首先考虑语法错误。比如结构体定义是否正确,是否在赋值前正确声明了结构体变量。例如,如果结构体没有正确初始化,或者变量声明错误,可能导致点号访问失败。例如,如果用户错误地使用了指针而没有解引用,应该用箭头运算符->而不是点号。但用户的问题明确提到使用点号,所以可能是结构体变量没有正确声明为实例,而是声明成了指针。 另外,检查作用域和访问权限。结构体的成员是否被正确声明为public?在C++中,结构体默认成员是public的,但如果是类(class),默认是private的,需要public关键字。但用户的问题中提到的是结构体,所以应该是public的。 还有可能涉及到编译器特定的问题。比如,用户是否在C项目中使用了C++的特性,或者编译器设置有问题?比如,文件扩展名是.c还是.cpp?C语言中结构体变量赋值需要显式使用struct关键字,除非用typedef。例如,在C中,如果没有typedef,声明结构体变量时需要struct 结构体名 变量名,而在C++中可以直接用结构体名。如果用户是在C语言模式下编译,可能需要调整声明方式。 比如,用户可能写了这样的代码: struct MyStruct { int a; }; MyStruct s; // 在C语言中这会报错,应该写成struct MyStruct s; s.a = 10; // 这里如果MyStruct没有被正确声明,就会报错 这时候,解决方案是使用typedef或者在声明时加上struct关键字。或者在C++模式下编译,因为C++允许省略struct关键字。 另外,可能用户的结构体定义在某个作用域之外,比如在函数内部定义,但在其他函数中使用,导致无法访问。或者结构体定义在头文件中但没有正确包含。 还有可能用户的Visual Studio项目设置有问题,比如使用了不兼容的编译器选项,或者代码中存在其他语法错误导致结构体未被正确识别。 再考虑用户提到的其他引用,比如引用[2]中提到的scanf报错问题,可能用户代码中有其他错误导致编译器报错,但实际错误位置不准确。比如,前面的错误导致后续代码被忽略,从而误报结构体赋值的问题。 或者用户可能在结构体赋值时试图在非声明区域进行赋值,比如在全局作用域直接对结构体成员赋值,这在C/C++中是不允许的,只能在函数内部进行赋值操作。 例如,以下代码会报错: struct Point { int x; int y; }; Point p; p.x = 10; // 在全局作用域,这样的赋值语句是不允许的,必须放在函数内部 正确的做法是在函数内部进行赋值: int main() { Point p; p.x = 10; return 0; } 此外,检查是否有拼写错误,结构体成员名称是否正确,或者结构体变量名是否正确。比如,结构体成员是a,但用户写成了A,或者在变量名中有拼写错误。 总结可能的原因: 1. 结构体变量声明错误,如在C语言中没有使用struct关键字或typedef。 2. 结构体成员访问权限问题(但结构体默认public)。 3. 在非函数体内进行赋值操作。 4. 拼写错误或变量名错误。 5. 编译器模式问题(C vs C++)。 6. 其他语法错误导致后续代码解析失败。 解决方案步骤可能包括: - 确保结构体正确定义,并在使用前声明。 - 检查变量声明是否正确,特别是在C语言中使用struct关键字或typedef。 - 确保赋值操作在函数体内。 - 检查拼写和变量名。 - 确认项目使用的是C++编译器(.cpp文件)以允许省略struct关键字。 - 处理其他可能的语法错误。 例如,用户可能在C语言项目中写了如下代码: // test.c struct Point { int x; int y; }; int main() { Point p; // 错误,在C中需要写成struct Point p; p.x = 10; return 0; } 此时会报错,因为C语言中必须使用struct关键字。解决方法是用typedef或在声明时加struct: typedef struct { int x; int y; } Point; 或者声明变量时: struct Point p; 或者在C++文件中编译,将文件扩展名改为.cpp。 如果用户确实在使用C语言,那么必须按C的语法来。而如果用户希望使用C++,则没有问题。 因此,解决方案需要根据用户的具体代码情况来建议,但常见的错误点可能在于C和C++的语法差异,或者在函数体外赋值,或者变量声明错误。</think>在Visual Studio中使用点号对结构体成员赋值报错,通常由以下原因及解决方案构成: --- ### **原因分析与解决方案** #### **1. C/C++语言模式混淆** - **问题现象**:在`.c`文件中直接使用`结构体名 变量名`声明变量 - **解决方案**: - **方法1**:显式添加`struct`关键字 ```c struct MyStruct { int value; }; int main() { struct MyStruct s; // C语言中必须加struct s.value = 10; // 正确赋值 return 0; } ``` - **方法2**:使用`typedef`简化声明(推荐) ```c typedef struct { int value; } MyStruct; int main() { MyStruct s; // 无需struct关键字 s.value = 10; return 0; } ``` - **方法3**:将文件扩展名改为`.cpp`,切换为C++编译器模式[^4]。 --- #### **2. 结构体作用域问题** - **问题现象**:结构体定义在函数内部,外部无法访问 - **解决方案**:将结构体定义在全局作用域或头文件中 ```cpp // 全局定义结构体 struct Student { int score; }; void func() { Student s; s.score = 90; // 正确 } ``` --- #### **3. 赋值操作位置错误** - **问题现象**:在函数体外直接对成员赋值 - **解决方案**:所有赋值操作需在函数内部执行 ```cpp struct Point { int x; }; // Point p; p.x = 10; // 错误!全局作用域不能执行赋值语句 int main() { Point p; p.x = 10; // 正确 return 0; } ``` --- #### **4. 拼写错误或成员名错误** - **问题现象**:成员变量名拼写错误(如`value`写成`valve`) - **解决方案**:检查结构体定义与赋值语句的成员名一致性。 --- #### **5. 其他编译器设置问题** - 确保项目未启用严格模式(如`/Za`禁用语言扩展)[^3]。 - 检查代码中是否存在其他语法错误(如缺少分号、括号),可能导致后续代码解析失败[^2]。 --- ### **验证示例** ```cpp #include <iostream> using namespace std; // 正确定义结构体 typedef struct { string name; int age; } Person; int main() { Person p; p.name = "Alice"; // 使用点号赋值 p.age = 25; cout << p.name << " " << p.age << endl; return 0; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值