1 c struct pointers function multidimensional-array
我正在尝试修改几个函数以返回结构类型而不更改所有值.具体来说,我正在尝试以各种方式调整图像大小并返回新图像的尺寸.我有一个名为"picspec"的结构,它包含netpbm图片文件的标题信息(宽度,高度,最大颜色值和指示格式的数字1-6).
一些图片编辑可能需要修改所有这四个(元素?结构的一部分),但许多只会影响其中的一些,并且最好在这些情况下保持原始值不变.我的第一直觉是结束这个功能:
picspec newinfo = {newx, newy, void, void};
return newinfo;
Run Code Online (Sandbox Code Playgroud)
...而且我对编译器错误并不特别感到惊讶.
注意:我意识到我可以通过将旧的"picspec"作为参数传递来轻松解决这个特定问题,但是"保持当前值"命令在其他情况下可能非常有用.我(目前非常有限)的指针知识让我觉得可以做到,但我没有取得太大成功.("自我指针"教会了我关于链接列表的所有信息,但这并不是我想到的.)
是否有"保持当前价值"的机制或同样简洁的方式来实现相同的目标?如果没有,最实用的替代方案是什么?
使用函数操作C结构有两种方法:
如果返回值,则必须返回整个结构.您实际上还不必创建新副本:
MyStruct myStructModified(MyStruct s, int delta) {
// s is already a copy of the original value
s.member += delta;
return s;
}
Run Code Online (Sandbox Code Playgroud)
...
{ // somewhere else, with MyStruct s
// replace value of s with new one
s = myStructModified(s, 10);
}
Run Code Online (Sandbox Code Playgroud)
返回相对较小的结构肯定是让自己专注于实际问题的好方法,而不是C指针问题,但是如果你想修改现有的结构,并且只限于C(而不是没有OOP的C类C++),那么你必须使用指针:
void modifyMyStruct(MyStruct *sp, int delta) {
sp->member += delta;
}
Run Code Online (Sandbox Code Playgroud)
...
{ // somewhere else, with MyStruct s
// pass pointer to s to function, which will modify it in-place
modifyMyStruct(&s, 10);
}
Run Code Online (Sandbox Code Playgroud)
如果你可以使用C++编译器,有第三种选择,使用C++引用,这只是糖涂指针:
void modifyMyStruct(MyStruct &s, int delta) {
s.member += delta;
}
Run Code Online (Sandbox Code Playgroud)
...
{ // somewhere else, with MyStruct s
// pass reference to s to function, which will modify it in-place
modifyMyStruct(s, 10);
}
Run Code Online (Sandbox Code Playgroud)
使用值更清晰,更安全,但速度更慢(复制结构中的所有数据).使用指针是有效的(只有地址通过,通常在CPU寄存器中,非常快),但如果你做错了,你很容易遇到崩溃的错误.如果你可以使用C++编译器,C++引用是指针的更简洁,更安全的替代品,通常是首选.