我遇到了一些编译的C代码,但我不明白为什么.具体来说,我有一个C库,它有很多使用这种格式的代码:
void get_xu_col(int i_start,
int n,
double x[n],
int n_x,
int n_u,
int n_col,
double xu_col[n_col][n_x + n_u]){
...
}
int main(){
...
double xu_col[n_col][n_x + n_u];
get_xu_col( ..., xu_col );
...
}
Run Code Online (Sandbox Code Playgroud)
我不明白的是编译器允许在数组中调整大小的原因.据我所知,尺寸必须固定(例如xu_col[9][7])或未定义(例如xu_col[][]).在上面的代码中,似乎大小不是编译时常量.
编译器是否只是忽略了这里的参数?或者它是否真的在维度上进行编译时检查?
如果是后者,那么分别传递尺寸似乎容易出错.
问题的第二部分是:
为什么相同的版本在C++中不起作用?当我从字面上文件扩展名从改变.c到.cpp,并尝试重新编译,我得到
candidate function not viable: no known conversion from 'double [n_col][n_x + n_u]' to 'double (*)[n_x + n_u]' for 7th argument
void get_xu_col(int i_start, int n, double x[n], int n_x, int n_u, int n_col, double …Run Code Online (Sandbox Code Playgroud) 有没有理由为什么代码块告诉我我不能创建一个数组?我只是想做:
const unsigned int ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
Run Code Online (Sandbox Code Playgroud)
它给了我
错误:在'{'标记之前,不允许使用括号括起的初始值设定项
我已经更改了初始化程序的其他部分,但错误总是说同样的事情.这似乎没有意义,因为这是我在c ++中学到的第一件事.
在以下规则中,当数组衰减到指针时:
左值[见2.5问题]型阵列的-T出现在表达衰变(有三个例外)转换成一个指向它的第一个元素的; 结果指针的类型是指向T的指针.
(例外情况是,当阵列是的sizeof或&运算符的操作数,或为字符数组一个文本字符串初始化.)
如何理解数组是"字符数组的文字字符串初始值设定项"的情况?请举个例子.
谢谢!
为什么不能将数组作为函数参数传递?
我一直在阅读这本C++书,上面写着"你不能将数组作为函数参数传递",但它从未解释过为什么.此外,当我在网上查找时,我发现了一些评论,比如'你为什么要这样做?' 这不是我会这样做的,我只是想知道为什么你不能这样做.
这是我长期以来一直想知道的事情.请看以下示例:
struct matrix
{
float data[16];
};
Run Code Online (Sandbox Code Playgroud)
我知道默认构造函数和析构函数在这个特定示例中做了什么(没有),但是复制构造函数和复制赋值运算符呢?
struct matrix
{
float data[16];
// automatically generated copy constructor
matrix(const matrix& that) : // What happens here?
{
// (or here?)
}
// automatically generated copy assignment operator
matrix& operator=(const matrix& that)
{
// What happens here?
return *this;
}
};
Run Code Online (Sandbox Code Playgroud)
它涉及std::copy或std::uninitialized_copy或memcpy或memmove或什么?
std::begin并std::end知道一个container或一个的开始和结束array.
它很容易知道end和begin的vector为例子,因为它是一个类,给出了这样的信息.但是,它如何知道如下结束array呢?
int simple_array[5]{1, 2, 3, 4, 5};
auto beg=std::begin(simple_array);
auto en=std::end(simple_array);
Run Code Online (Sandbox Code Playgroud)
std::begin并不难知道数组的起始位置.但它如何知道它的结束?将常数整数5存储在某处吗?
如果我得到一些低级信息的答案,我将不胜感激.
我相信如果你使用C,我理解在内存中如何表示正常的变量和指针.
例如,很容易理解指针Ptr将具有一个地址,并且它的值将是一个不同的地址,这是它指向的内存空间.以下代码:
int main(){
int x = 10;
int *Ptr;
Ptr = &x;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
将在内存中具有以下表示:
+---------------------+-------------+---------+
| Variable Name | Address | Value |
+---------------------+-------------+---------+
| x | 3342 | 10 |
+---------------------+-------------+---------+
| Ptr | 5466 | 3342 |
+---------------------+-------------+---------+
Run Code Online (Sandbox Code Playgroud)
但是我发现很难理解数组如何在内存中表示.例如代码:
int main(){
int x[5];
x[0]=12;
x[1]=13;
x[2]=14;
printf("%p\n",(void*)x);
printf("%p\n",(void*)&x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出相同的地址两次(为简单起见10568).意思是x ==&x.然而,*x(或数组符号中的x [0])等于12,*(x + 1)(或数组符号中的x [1])等于13,依此类推.怎么能代表这个?一种方法可能是这样的:
+---------------------+-------------+----------+----------------------+
| Variable Name | Address | Value | Value IF array |
+---------------------+-------------+----------+----------------------+
| x | 10568 …Run Code Online (Sandbox Code Playgroud) int numbers[20];
int * p;
Run Code Online (Sandbox Code Playgroud)
这两项任务是否相同?
p = numbers;
p = &numbers[0];
Run Code Online (Sandbox Code Playgroud) 在stackoverflow的上一个问题中的一段代码中,我看到了这个,对我来说很奇怪,声明using:
template <std::size_t SIZE>
class A
{
public:
...
using const_buffer_t = const char(&)[SIZE];
...
};
Run Code Online (Sandbox Code Playgroud)
有人可以解决以下问题: