【问题标题】:Taking arrays as arguments with triple pointers使用三重指针将数组作为参数
【发布时间】:2019-03-18 08:23:26
【问题描述】:

请告诉我使用单指针、双指针或三指针接受数组的函数之间的区别。

示例代码:

int visit(int ***A, int i, int j, int n, int m, int size) {
     (*A)[i][j] = -1;
     size++;
     if(i-1 >= 0 && j-1 >= 0 && (*A)[i-1][j-1] == 1) {
        size += visit(A, i-1, j-1, n, m, 0);
     }
     if(i-1 >= 0 && (*A)[i-1][j] == 1) {
         size += visit(A, i-1, j, n, m, 0);
     }
     if(i-1 >= 0 && j+1 < m && (*A)[i-1][j+1] == 1) {
         size += visit(A, i-1, j+1, n, m, 0);
     }
     if(j-1 >= 0 && (*A)[i][j-1] == 1) {
         size += visit(A, i, j-1, n, m, 0);
     }
     if(j+1 < m && (*A)[i][j+1] == 1) {
         size += visit(A, i, j+1, n, m, 0);
     }
     if(i+1 < n && j-1 >= 0 && (*A)[i+1][j-1] == 1) {
         size += visit(A, i+1, j-1, n, m, 0);
     }
     if(i+1 < n && (*A)[i+1][j] == 1) {
         size += visit(A, i+1, j, n, m, 0);
     }
     if(i+1 < n && j+1 < m && (*A)[i+1][j+1] == 1) {
         size += visit(A, i+1, j+1, n, m, 0);
     }
     return size; 
}

***A 是什么意思?

【问题讨论】:

  • 你甚至不愿意告诉我们语言..
  • 哦!..我的错..它是 C++。
  • 贴个标签,让 C++ 的人可以找到它
  • 完成先生。现在,您能告诉我为什么我们将 'A' 传递为 '***A' 。它有什么优势?
  • 不,我不是c++高手

标签: c++ arrays function pointers


【解决方案1】:

"请告诉我使用单指针、双指针或三指针接受数组的函数之间的区别。"

数组(例如int[])将在编译期间更改为(int*)...

例如取整数int some_num = 10;

现在,当你突然想将这些数字存储为数组时,你会怎么做,当然int[] some_num_array = { some_num, some_num2, some_num3 }; 这是最通用的方法......

如果您知道vectors,那么向量等价物将是:std::vector&lt;int&gt; some_num_array{ some_num, some_num2, some_num3 }...

而且您可能已经知道向量的作用,它是一个 容器,在其中存储值,当然它永远无法存储无限值,因为它会占用您的内存并且会变得像你的记忆力可以处理......

你问的这个int*** A,可以解释为std::vector&lt;std::vector&lt;std::vector&lt;int&gt;&gt;&gt;...

正如你已经看到的,它是一个向量 包含向量 向量的...

那么,同样的,它也是一个指针 包含指针 指针...

引用运算符(&)用于将指针转换为超级指针等等...而在C/C++中引用的意思是允许其他成员和函数分配一个给变量赋值(记住!永远不能给变量赋值!)...

如果我们尝试将上面的数字 some_num 转换为 int***,这意味着将非指针变量转换为 3 级指针,其值为 5...auto A = new int**(new int*(&amp;some_num));

所以换句话说,int*** 可以被称为一个三维指针(数组),就像您已经看到一个二维数组在其 (索引)中存储列一样。

另一方面,一个三维数组在其内部存储多个二维数组(sides)...

"****A 是什么意思?*"

在这里,您可以将人们与一个已知的术语混淆为 dereferencing,并且与引用完全相反,我们一直在谈论的事实......它dereferences (减少[因此,在术语中使用 de] 所谓的 pointer-level 一个接一个)...

像这样,some_num = ***A;,它只是将 A 的值存储在 some_num

但是,另一方面,***A = some_num; 不同,它会在任何地方改变 A 的值,而 NOT 指针本身,这就是为什么@ 987654336@ 不能为赋值取消引用,因为其取消引用的值是一个常量字符,是一个常量......(在函数内部或外部)

所以,最后,我想说的是,指针的使用要么能够取消引用它的值(修改值,而不是指针),要么创建一个内存数组- 基于指针级别的限制...

【讨论】:

    猜你喜欢
    • 2012-01-24
    • 2017-12-02
    • 2018-05-14
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2010-12-15
    • 2011-01-09
    相关资源
    最近更新 更多