替代符号*(ptr)[j ++]?

时间:2016-06-17 10:59:18

标签: c++ arrays pointers

当将双指针传递给函数时,我在函数中使用了符号*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),但我问的是那个特例。

3 个答案:

答案 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: &quot;Lucida Sans Unicode&quot;, &quot;Lucida Grande&quot;, 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>,模板和其他更好/更新的替代方案。