当将双指针传递给函数时,我在函数中使用了符号*ptr[j++]
,导致程序崩溃。我猜测它是由于运算符优先级而发生的,所以我通过编写(*ptr)[j++]
来纠正它,但我不喜欢这种表示法。感觉很长很困惑。
我也知道符号ptr[0][j++]
,但我也不喜欢它。对于所有这些,还有更好的符号或方法吗?
我的代码:
#include <iostream>
using namespace std;
void mset(int **ptr, size_t size);
void main(void)
{
const size_t size = 10;
int *ptr = new int[size];
mset(&ptr, size);
for (size_t n = 0; n < size; n++) {
std::cout << ptr[n] << std::endl;
}
}
void mset(int **ptr, size_t size)
{
size_t j = 0;
while(j < size)
(*ptr)[j++] = 3;
}
P.S我知道我可以写void mset(int *ptr, size_t size)
并调用mset(ptr, size
),但我问的是那个特例。
答案 0 :(得分:6)
简单地使用额外的间接级别,例如:
auto p = *ptr;
for (size_t j = 0; j < size; ++j)
p[j] = 3;
答案 1 :(得分:2)
对于这种特殊情况,在mset(int **ptr, size_t size)
内,您永远不会使用ptr
。但使用解除引用(即*ptr
)。因此,我建议传递指针引用。
mset(ptr, size);
// ^^^ pass simply
void mset(int* const &ptr, const size_t size)
{ // ^^^ pointer reference which cannot change (prevents memory leak)
size_t j = 0;
while(j < size)
ptr[j++] = 3; // No dereferencing required
}
您也可以删除引用,因为您不打算在ptr
中更改mset()
的值。但如上所述,通过ptr
可以使用相同的main()
也可以。
这是demo
顺便说一句,符合标准的main()
始终会返回int
。
答案 2 :(得分:0)
将第一级指针(int*
和不 const
)声明为void mset(int const** ptr, size_t size)
{
size_t j = 0;
while (j < size)
*ptr[j++] = 3; // ERROR
}
,编译器会引发错误:
const
您确定基本指针不会改变,并且您不希望函数更改其内容,因此make为vectors
。但是,多级指针确实会导致问题,最好使用引用,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>jQuery Show Hide Using Select Box</title>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("select").change(function() {
$(this).find("option:selected").each(function() {
if ($(this).attr("value") == "customsize") {
$(".customsize").show();
} else {
$(".box").hide();
}
});
}).change();
});
</script>
</head>
<body>
<div>
<select name="product[]" style="display: block; width: 256px; border-color: rgb(204, 204, 204); font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; font-size: 0.9em; padding: 0.3em;">
<option>Select Size</option>
<option style="box-sizing: border-box;" value="30">Chest 30in</option>
<option style="box-sizing: border-box;" value="32">Chest 32in</option>
<option style="box-sizing: border-box;" value="34">Chest 34in</option>
<option style="box-sizing: border-box;" value="36">Chest 36in</option>
<option style="box-sizing: border-box;" value="38">Chest 38in</option>
<option style="box-sizing: border-box;" value="40">Chest 40in</option>
<option value="customsize">Custom Size*</option>
</select><br />
</div>
<div class="customsize box">
<select name="product[]" style="display: block; width: 256px; border-color: #cccccc; font-family: 'Lucida Sans Unicode', 'Lucida Grande', sans-serif; font-size: 0.9em; padding: 0.3em;">
<option style="box-sizing: border-box;" value=" ">Body Length (in)</option>
<option style="box-sizing: border-box;" value="30">30</option>
<option style="box-sizing: border-box;" value="31">31</option>
<option style="box-sizing: border-box;" value="32">32</option>
<option style="box-sizing: border-box;" value="33">33</option>
<option style="box-sizing: border-box;" value="34">34</option>
<option style="box-sizing: border-box;" value="35">35</option>
<option style="box-sizing: border-box;" value="36">36</option>
<option style="box-sizing: border-box;" value="37">37</option>
<option style="box-sizing: border-box;" value="38">38</option>
<option style="box-sizing: border-box;" value="39">39</option>
<option style="box-sizing: border-box;" value="40">40</option>
</select><br />
</div>
</body>
</html>
,模板和其他更好/更新的替代方案。