首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替代符号*(ptr)[j++]?

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

Stack Overflow用户
提问于 2016-06-17 10:59:17
回答 3查看 228关注 0票数 4

在传递指向函数的双指针时,我在函数中使用了表示法*ptr[j++],这会导致程序崩溃。我猜这是因为操作符优先,所以我通过编写(*ptr)[j++]来纠正它,但是我不喜欢这个符号。感觉又长又混乱。

我也知道ptr[0][j++]的表示法,但我也不喜欢it.Is,有什么更好的表示法或方法来解决这些问题吗?

我的代码:

代码语言:javascript
复制
#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),但是我询问的是这个特殊的情况。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-17 11:03:05

简单地使用额外的间接级别,如下所示:

代码语言:javascript
复制
auto p = *ptr;
for (size_t j = 0; j < size; ++j)
    p[j] = 3;
票数 6
EN

Stack Overflow用户

发布于 2016-06-17 11:08:21

对于这个特殊情况,在mset(int **ptr, size_t size)内部,您永远不会像现在这样使用ptr。但与取消引用(即*ptr)一起使用。因此,我建议传递指针引用

代码语言:javascript
复制
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
}

您也可以删除引用,因为您不打算更改ptrmset()中的值。但是,如前所述,能够使用来自main()的相同的main()也很好。

这是演示

顺便说一句,符合标准的main()总是返回int

票数 2
EN

Stack Overflow用户

发布于 2016-06-17 19:17:35

将一级指针(int**,而不是int*)声明为const,编译器将引发错误:

代码语言:javascript
复制
void mset(int const** ptr, size_t size)
{
    size_t j = 0;
    while (j < size)
        *ptr[j++] = 3; // ERROR
}

您确信基本指针不会更改,并且不希望函数更改其内容,所以make is const。然而,多个级别的指针确实会导致问题,最好使用引用、vectors、模板和其他更好的/更新的选项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37879887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档