. 与 -> 的区分
介绍
定义一个 struct 结构体
struct test{
string name;
int marks, classes, rank;
};
当定义一个数据变量时,如: test a;
如果我们要读取其中名为 rank
的成员,我们只需要运用 .
运算符即可,代码如下:a.rank
但,如果定义一个指针变量时,如: test *p
这时,如果我们要读取其中名为 rank
的成员,运用 .
运算符就需要如下代码:(*p).rank
由于 程序猿们过于懒惰 代码不便于书写,我们就用 ->
(一个减号和一个大于号)做了简化:p->rank
综上所述,.
和 ->
均为访问“类类型结构体”(struct
、class
等类型的结构体)成员的运算符,区别在于 .
用来访问数据类型变量,->
用来访问指针类型变量
总结
1、A->a 表示指向结构体类型 A 中的指针类型 a
2、A.a 表示指向结构体 A 中的数值类型 a
3、A->a 等效于 (A).a
完整代码
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
struct test{
string name;
int marks;
};
int main(){
test a;
a.name = "ZhangSan";
a.marks = 50;
test *p = &a;
cout << "a:" << "\n" << a.name << " " << a.marks << "\n" << "\n";
cout << "p:" << "\n" << p->name << " " << p->marks << "\n" << "\n";
cout << "p:" << "\n" << (*p).name << " " << (*p).marks << "\n" << "\n";
return 0;
}
运行结果如下:
输出使用 printf
:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
struct test{
string name;
int marks;
};
int main(){
test a;
a.name = "ZhangSan";
a.marks = 50;
test *p = &a;
// cout << "a:" << "\n" << a.name << " " << a.marks << "\n" << "\n";
// cout << "p:" << "\n" << p->name << " " << p->marks << "\n" << "\n";
// cout << "p:" << "\n" << (*p).name << " " << (*p).marks << "\n" << "\n";
printf("a:\n%s %d\n\n", a.name.c_str(), a.marks);
printf("a:\n%s %d\n\n", p->name.c_str(), p->marks);
printf("a:\n%s %d\n\n", (*p).name.c_str(), (*p).marks);
return 0;
}
如何使用 printf 输出 string 类型字符串
报错样例
注意:如果输出时代码为
printf("a:\n%s %d\n\n", a.name, a.marks);
会出现这种情况:
出错原因
因为 printf 是针对 c 语言的输出语句,仅针对 c 语言内置数据类型,而 string 不属于 c 语言内置数据类型,因此编译器无法编译该语句
解决方法
输出 string 类型的字符串,可以使用 string 的函数 c_str() ,返回字符串的首字符的地址来输出整个字符串:
printf("a:\n%s %d\n\n", a.name.c_str(), a.marks);