2D数组和数组数组之间有什么区别?
我读过像@ Dave这样的评论,似乎可以区分这两者.
如果他使用2d数组或指针到数组类型而不是数组数组,则会中断. - 戴夫
我一直认为这两个都提到:
int arr_arr[][];
Run Code Online (Sandbox Code Playgroud)
编辑: @FutureReader,您可能希望看到如何在C++中使用数组?
可能重复:
为什么我的程序在完全循环8192个元素时会变慢?
我一直在修补一个程序,我用它来简单地总结一个二维数组的元素.一个错字导致了至少在我看来,一些非常奇怪的结果.
处理数组时,矩阵[SIZE] [SIZE]:
for(int row = 0; row < SIZE; ++row)
for(int col = 0; col < SIZE; ++col)
sum1 += matrix[row][col];
Run Code Online (Sandbox Code Playgroud)
运行得非常快,但上面的行sum1 ...被修改:
sum2 += matrix[col][row]
Run Code Online (Sandbox Code Playgroud)
正如我在没有意识到的情况下偶然做过的那样,我注意到我的运行时间显着增加.为什么是这样?
C++编译器是否像在C中一样处理数组?
例如
在C中,
在这两种语言的基本来源字符集包括每除外打印的ASCII字符@,$和`.我可以理解不使用重音,因为它并不总是被解释为一个单独的角色,它看起来也非常类似于撇号.但有没有一个特定的原因,为什么@和$没有任何用法或语言设计师只是用尽了想法?:)
我试图将一个二维数组传递给一个接受指向指针的指针的函数。而且我了解到二维数组不是指向指针的指针(指向一维数组的指针)。当我编译下面的代码时,我收到了这个错误。
#include<iostream>
void myFuntion(int **array)
{
}
int main()
{
int array[][]= {{1,2,3,4},{5,6,7,8,9},{10,11,12,13}};
myFuntion(array);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在函数“int main()”中:第 5 行:错误:将“数组”声明为多维数组必须具有所有维度的边界,但由于 -Wfatal 错误而终止的第一次编译除外。
如果可能的话,任何人都可以清除我对此的疑虑和一些文档,以消除我的更多疑虑。
在GotW 94中,Herb Sutter区分了"经典C++"声明
const char* s = "Hello";
Run Code Online (Sandbox Code Playgroud)
和"现代"风格
auto s = "Hello";
Run Code Online (Sandbox Code Playgroud)
他告诉我们,有一个"中的类型细微的差别s,这里的auto风格是比较正确的." [编辑补充:评论表明,这可能不是Sutter实际意义的公平表示; 见下面的讨论.]
但是......有什么区别?我的印象是a const char *是引用字符串文字的正确方法.此外,当我问我的调试器(lldb)时,它似乎认为类型实际上是相同的:
* thread #1: tid = 0x1756c2, 0x0000000100000f8f test`main + 31 at test.cc:4, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100000f8f test`main + 31 at test.cc:4
1 int main(void) {
2 const char* s = "Hello";
3 auto t = "Hello";
-> 4 return 0;
5 }
(lldb) fr v
(const …Run Code Online (Sandbox Code Playgroud) 如果我创建一个const值的全局数组,例如
const int SOME_LIST[SOME_LIST_SIZE] = {2, 3, 5, 7, 11};
Run Code Online (Sandbox Code Playgroud)
是否有可能以任何方式修改SOME_LIST?
我怎么写这个SOME_LIST指向一个const内存位置,并且是一个const指针本身(即不能指向其他地方)?
有几种方法可以在没有内存操作的情况下在C++和STL中定义2D数组,以下代码说明了两种不同的方法:
int main ()
{
/**************
1 2 3
4 5 6
***************/
// Method 1
const int ROW = 2;
const int COL = 3;
int array1[ROW][COL];
for(int i=0; i<ROW; i++)
for(int j=0; j<COL; j++)
array1[i][j] = i*COL+j+1;
// Method 2
typedef vector<vector<int> > ARRAY;
ARRAY array2;
vector<int> rowvector;
for(int i=0; i<ROW; i++)
{
rowvector.clear();
for(int j=0; j<COL; j++)
rowvector.push_back(i*COL+j+1);
array2.push_back(rowvector);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:还有其他方法来定义2D数组吗?哪一个最有效?谢谢!
假设我有一个可以通过constexpr函数返回常量表达式的类:
template<int N>
struct Foo {
constexpr int Bar() const { return N; }
};
Run Code Online (Sandbox Code Playgroud)
如果我想初始化constexpr值Foo::Bar(),我应该如何传递类型的参数Foo?我已经尝试了这两个,constexpr每个都有一个示例变量来测试它是否可以初始化:
template<int N>
constexpr int ByValue(Foo<N> f) {
constexpr int i = f.Bar();
return f.Bar();
}
template<int N>
constexpr int ByReference(const Foo<N> &f) {
constexpr int i = f.Bar();
return f.Bar();
}
constexpr int a = ByValue(Foo<1>{});
constexpr int b = ByReference(Foo<1>{});
Run Code Online (Sandbox Code Playgroud)
但是clang 3.7引发了一个错误,ByReference而gcc> = 5.1则没有:现场演示
main.cpp:15:25: error: constexpr variable 'i' must be initialized …Run Code Online (Sandbox Code Playgroud)