C语言结构体访问中指针表示法与点表示法的使用疑问
问题解答
疑问1:结构体指针为什么用点运算符访问成员
你传入的idCard是指向NameCard结构体数组首元素的指针,当你使用idCard[b]这种下标访问语法时,等价于执行了*(idCard + b),已经完成了指针解引用,得到的是一个**NameCard类型的实体对象**,而非结构体指针,因此使用点运算符访问成员是正确的。
如果你想用箭头运算符->,可以写成(idCard + b)->personName,和idCard[b].personName语义完全等价。
疑问2:(idCard[b].personName)[c]的写法是否正确
这种写法语法完全正确。idCard[b].personName拿到的是姓名字符串的首地址(不管该成员是char数组还是char*指针),后面加[c]就是取下标为c的字符。外层的括号可以省略,直接写成idCard[b].personName[c]也完全合法,加括号只是提升可读性,不影响执行逻辑。
额外问题提示
你现有代码还存在几处逻辑错误,可以同步修正:
- 字符串比较不能用
==,这是在比较两个字符串的首地址,不是比较内容,需要用strcmp函数判断相等:strcmp(idCard[i].personName, name) == 0 - 遍历姓名转小写的循环里,变量
c没有在每次遍历新名片时重置,第一次遍历后c就不会从0开始计数,会导致后续转小写逻辑异常 - 删除元素的
do-while循环条件错误,会出现数组越界访问,正确的逻辑是删除元素后将后面的元素依次前移,最后把数组长度*size减1
内容的提问来源于stack exchange,提问作者Michelin_Boi
相关产品推荐
相关产品推荐

