在传递指向函数的双指针时,我在函数中使用了表示法*ptr[j++],这会导致程序崩溃。我猜这是因为操作符优先,所以我通过编写(*ptr)[j++]来纠正它,但是我不喜欢这个符号。感觉又长又混乱。
我也知道ptr[0][j++]的表示法,但我也不喜欢it.Is,有什么更好的表示法或方法来解决这些问题吗?
我的代码:
#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;
}我知道我可以编写void mset(int *ptr, size_t size)并调用mset(ptr, size),但是我询问的是这个特殊的情况。
发布于 2016-06-17 11:03:05
简单地使用额外的间接级别,如下所示:
auto p = *ptr;
for (size_t j = 0; j < size; ++j)
p[j] = 3;发布于 2016-06-17 11:08:21
对于这个特殊情况,在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()中的值。但是,如前所述,能够使用来自main()的相同的main()也很好。
这是演示。
顺便说一句,符合标准的main()总是返回int。
发布于 2016-06-17 19:17:35
将一级指针(int**,而不是int*)声明为const,编译器将引发错误:
void mset(int const** ptr, size_t size)
{
size_t j = 0;
while (j < size)
*ptr[j++] = 3; // ERROR
}您确信基本指针不会更改,并且不希望函数更改其内容,所以make is const。然而,多个级别的指针确实会导致问题,最好使用引用、vectors、模板和其他更好的/更新的选项。
https://stackoverflow.com/questions/37879887
复制相似问题