int main()
{
matrix[2][4] = {{11,22,33,99},{44,55,66,110}};
int **ptr = (int**)matrix;
printf("%d%d",**matrix,*ptr);
}
Run Code Online (Sandbox Code Playgroud)
但是当一个2-d数组作为参数传递时,它被转换为(*matrix)[2] ..编译器将这个数组存储为什么类型...是存储为2-d数组还是双指针或指向数组的指针.如果它作为数组存储,它如何在不同的情况下如上所述进行不同的解释.请帮我理解.
C++03§4.2N°1:
类型为"NT的数组"或"T的未知边界数组"的左值或右值可以转换为"指向T的指针"的右值.结果是指向数组的第一个元素.
很长一段时间以来我在这个陈述中令人困惑的是,我不太明白阵列类型的右值是什么意思.也就是说,我无法想出一个表达式,其类型是一个数组,结果是一个右值.我读了这个帖子,基本上问了同样的问题,接受的答案是"不,没有数组类型的右值".我想我可能与此矛盾.
C++03§5.2.5N°4 :(关于表达式E1.E2)
如果E2是非静态数据成员,E1的类型是"cq1 vq1 X",E2的类型是"cq2" vq2 T",表达式指定由第一个表达式指定的对象的命名成员.如果E1是左值,则E1.E2是左值.
我认为否则它是一个右值(假设E2不是参考,那个案例被覆盖§5.2.5 N°3)因此......
struct A
{
int a[4];
};
A f()
{
A a;
return a;
}
int main()
{
f().a; //I think this is an rvalue of array type...
}
Run Code Online (Sandbox Code Playgroud)
我在这里看到两个选项:
选项1:我是正确的,欢呼,是的,很酷.在这种情况下,问题是:还有其他例子吗?
选项2:我不对,在这种情况下问题是:这是标准的缺陷吗?
我不知道1,但我真的怀疑2,因为当他们谈论函数到指针的转换时,他们只提到了函数类型的左值(很明显没有这样的rvalues).所以他们很可能已经考虑了数组类型的rvalues.
所以,基本上我的问题是我是否提出了数组类型右值的例子,如果没有,请提供一个有效的,我坚信它存在.
$ 4.2/1 - "类型的左值或右值"数组"N T"或"未知T的数组"可以转换为"指向T的指针"的右值.结果是一个指向第一个元素的指针阵".
我不知道如何在初始化/声明期间获得数组类型的rvalue?
使用Visual Studio Express 2013.我以为我理解静态与动态数组,但以下让我困惑:
int* a = new int[3]; \\ dynamic array
int** pa = &a;
int b[3]; \\ static array
int** pb = &b; \\ error: cannot convert from 'int (*)[3]' to 'int **'
Run Code Online (Sandbox Code Playgroud)
好吧,所以我尝试int (*)[3] pb = &b;但它甚至在语法上都不正确.本地窗口说pb是一个int[3],但int[3]* pb = &b;也是不正确的.

它似乎也奇怪,我b有相同的值pa.如果我用int b[3];声明+初始化替换声明int b[3] = {};那么奇怪就会消失,所以也许它只是一个VS错误:

但我仍然无法获得静态数组的地址.如果我输入&b立即窗口然后我得到完全相同的输出,就像我刚输入一样b,与'&a'和'a'相比,这看起来很奇怪,这些明显不同:

定理说我们不能将数组初始化为另一个数组的副本.但是我们可以将指针初始化为指向另一个数组的第一个元素的指针副本:
int a[] = {0, 1, 2};
int a2[] = a; //error
int *a3 = a; //OK
Run Code Online (Sandbox Code Playgroud)
为什么int a2[] = a;会出错?
我试图研究我认为被称为发射器的东西?概念是将所有二进制文件写入缓冲区,然后将缓冲区加载到内存中.我已经看到这个代码反复弹跳(我编写了exe,所以我可以访问其中的代码.):
//HardCoded Binary For testing Reason, reading to launch didn't work neither did this
char RawCode[11414] = {
0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0xFF, 0xFF, ............................................... 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}
//Main Function
int main(int argc, char* argv[])
{
int(*f)();
f = (int(*)())&RawCode;
(int)(*f)();
}
Run Code Online (Sandbox Code Playgroud)
我的原始想法可能是空字节影响执行导致访问冲突,所以经过一些研究后我发现一个消息框shellcode格式为"/x41/x41/.......x41/",没有空字节而这仍然没有奏效.由于没有太多关于此的信息,我有点迷茫.有没有人对一些好的文章或有用的教程有一些参考,因为我找不到任何帮助.谢谢大家的时间!
如果我写int* a = new int[5];,然后我打电话sizeof(a)或sizeof(*a),我没有得到我想要的信息,因为数组已经衰变为指针.但是,我想知道我们是否有办法做这样的事情:
int[5]* a = new int[5];
我很确定我们能够用堆栈内存做到这一点,但我不确定是否有任何方法可以为堆内存执行此操作,因为以上内容无法编译.如果没有办法,有没有理由不这样做?
我有一个网格,我想传递给另一个显示它的函数.但是,我似乎无法弄清楚我将如何声明该函数,多维数组通过引用传递给该函数.
void foo(bool[][]&); //INCORRECT: how is a correct way to declare this function?
// rest of code :
int main(){
bool grid[50][50] = {false};
foo(grid);
return 0;
}
void foo(bool& grid[][]){
// do things
}
Run Code Online (Sandbox Code Playgroud)
这应该是一个基本问题,但我在寻找解决方案时遇到了很多麻烦.
考虑以下代码:
static char a[2][2] = {
{ 1, 2 },
{ 3, 4 },
};
int main()
{
char **p = (char**)a; // needs cast, or compiler complains (which makes sense)
printf("%p\n", p);
printf("%p\n", &a[1][0]);
printf("%d\n", a[1][0]);
printf("%p\n", &p[1][0]); // why null? why doesn't compiler complain about this?
printf("%d\n", p[1][0]); // segfault, of course
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
0x804a018
0x804a01a
3
(nil)
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
我知道数组可以衰减到指针.我不明白为什么编译器(g ++)会让我尝试反过来.如果p是char**,为什么它让我使用p [x] [x]而不是警告?它显然甚至没有接近工作,因为结果指针为空.
顺便说一下,我问这个来自第三方的代码,显然对他们有效.(在Windows中编译,而不是使用g ++编译).所以,我不是在寻找有关如何修复此代码的建议,我已经知道如何做到这一点.我只是想了解编译器为什么不抱怨,以及为什么结果是空指针.
谢谢.
假设我有一个指向整数的指针数组(即每个元素都是指向int的指针)
int** ptrArray;
Run Code Online (Sandbox Code Playgroud)
我想阻止更改数组条目指向的整数
我需要把const放在哪里?
1. const int ** ptrArray
2. int const ** ptrArray
3. int *const* ptrArray
4. int ** const ptrArray
Run Code Online (Sandbox Code Playgroud)
对此有什么规定吗?像"第一个const保护数据","第二个const保护指针"等等?
const的位置背后是否有任何逻辑?放置的地方与保护的地方之间有什么联系?
这对我来说是一个令人困惑的问题,如果有人可以给我任何指导或链接,我会真的很高兴我可以阅读更多关于如何以及在何处使用const基于我想要保护的内容(如果我需要使用三维数组中的const或左右)
我会尽量直截了当。
我有一个练习要解决,我在网上搜索了很多,但找不到我的问题所在。
因为这是一个“原样”练习,我不能将 float* 修改为 float[],我必须使用给定的值和给定的函数签名。我只能使用 setWeight 函数的包含。
考虑以下:
class Train
{
protected:
float* weight;
public:
setWeight(float* weight)
{
this->weight = weight;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在主要我调用以下内容:
main()
{
float weights[] = { 30.5f, 20.0f, 12.7f, 15.88f };
train.setWeight(weights);
}
Run Code Online (Sandbox Code Playgroud)
当我查看调试模式时,只有第一个值被传递。有人可以帮我吗?