c - 学习如何在使用 scanf (C) 时正确引用结构字段
问题描述
我做了这个结构
struct dadosPessoais
{
char nome[60];
char end[60];
char cidade[60];
char estado[3];
int cep;
};
typedef struct dadosPessoais dadosPessoais
另外,我已经声明了这些变量和指针
dadosPessoais dp[4], *dpp;
我目前正在尝试做的是从用户接收一些数据并使用 *dpp 指针将这些数据存储在 dp[] 变量中。为此,我制作了这个循环结构
for (i = 0; i < 4; i++)
{
dpp = &dp[i];
printf("-- Dados da %da pessoa --\n", i + 1);
printf("Nome: ");
scanf("%s", dpp->nome);
getchar();
printf("Endereço: ");
scanf("%s", dpp->end);
getchar();
printf("Cidade: ");
scanf("%s", dpp->cidade);
getchar();
printf("Estado: ");
scanf("%s", dpp->estado);
getchar();
printf("Cep: ");
scanf("%d", dpp->cep);
getchar();
system("clear");
}
我知道在使用scanf时使用类似的东西dpp->field
是不正确的,因为箭头运算符(->)用于通过使用该结构变量的地址返回结构字段值,而不是用于返回结构字段地址本身。但是,如果我尝试使用类似的东西dpp.field
仍然不起作用,那么令人困惑的是,因为它应该意味着类似的东西&dp[index].field
,对吧?我仍然不知道如何解决这个问题......
解决方案
Afterdpp = &dp[i];
被执行,dpp
指向struct dadosPessoais
. thendpp->cep
指的cep
是 that 的成员struct
,并且&dpp->cep
是那个成员的地址。因此,要将cep
成员的地址传递给scanf
,传递&dpp->cep
。
使用scanf
with 时%s
,您应该传递数组中第一个字符的地址。所以,对于dpp->nome
,你可以通过&dpp->nome[0]
。
但是,由于nome
它是一个数组,当您在表达式中使用它时,它会自动转换为指向其第一个元素的指针。1因此,您可以使用 pass dpp->nome
to scanf
,它与 pass 相同&dpp->nome[0]
。
脚注
1sizeof
当数组是 的操作数、一元运算&
符(获取地址)的操作数或用于初始化数组的字符串文字时,不会发生这种自动转换。特别注意&array
andarray
是指针,但 的类型&array
是“指向数组的指针”,而array
自动转换后是指向数组元素的指针。
推荐阅读
- python - 熊猫用字符串和整数相加行
- scala - 在scala中动态地对案例类字段进行groupBy
- java - 如何在按钮单击时添加小部件?
- jenkins - 区分 Junit Jenkins 插件中的 xml 文件
- android - ConstraintLayout 中的 RecyclerView 项不占其父项的全宽
- java - 无法设置 JSTL 用户变量而不是 java.lang.String
- angular - Hostlistener 给出错误的 nativeelement.value 值和点击事件
- apache-kafka - Kafka 连接:基于模式的单个主题接收到多个表
- android - 在 SearchView 中添加多字段搜索
- java - JMeter 脚本停止工作,内存泄漏,OutOfSpace Java