Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数组和数组指针在编译后的区别?_C++_C_Arrays_Pointers - Fatal编程技术网

C++ 数组和数组指针在编译后的区别?

C++ 数组和数组指针在编译后的区别?,c++,c,arrays,pointers,C++,C,Arrays,Pointers,例如,在这个函数中,变量a指向内存中一行中有9个整数的位置 但是c呢?c是否指向内存中一个位置,该位置指向内存中一行包含9个整数的位置 那么,从技术上讲,c是单层指针还是双层指针 我上面说的不应该是真的吗?当我执行以下函数时,为什么会出现这种情况: void m() { char a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; char(*c)[3][3] = (char (*)[3][3])a; printf("%d\n", *c[0][0])

例如,在这个函数中,变量
a
指向内存中一行中有9个整数的位置

但是
c
呢?
c
是否指向内存中一个位置,该位置指向内存中一行包含9个整数的位置

那么,从技术上讲,
c
是单层指针还是双层指针

我上面说的不应该是真的吗?当我执行以下函数时,为什么会出现这种情况:

void m() {
    char a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    char(*c)[3][3] = (char (*)[3][3])a;
    printf("%d\n", *c[0][0]);
}

a和c都指向相同的位置?c不应该是双层指针,a不应该是指向内存中某个位置的指针吗?

看看这些类型定义:

void m() {
    char a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    char(*c)[3][3] = (char (*)[3][3])a;
    printf("%d\n", *c[0][0]);
    printf("a...%p\nc...%p\n", a, c);
}
如果我们检查尺寸:

typedef char9[9];
typedef char3x3[3][3];
cout
变量
a
指向内存中一行有9个整数的位置

否。变量
a
是内存中的一个位置,一行中有9个整数
a
只是该位置的名称

c是否指向内存中一个位置,该位置指向内存中一行中包含9个整数的位置

否。
c
是内存中的一个位置,它指向内存中一行中包含9个整数的位置
c
是包含指针的位置的名称

那么,从技术上讲,c是单层指针还是双层指针


单人房。

哦,那么我不应该用它了?我们不是说你不应该用它。我们说这是未定义的行为。如果你可以用它做任何事情,那么你可以用它。只要做好准备,让它崩溃,或者点比萨饼,或者把你的信用卡数据交给俄罗斯黑客,或者看起来工作正常,除非它在你的代码中留下一个漏洞,静静地存在好几年,直到有人发现它并用它从你的业务中删除几百万美元,等等。你决定它是否值得。我们认为可能不是,您应该避免使用它。
printf(“%d\n”,*c[0][0])应该是
printf(“%d\n”,(*c)[0][0])*c
=>
1
,并评估
1[0][0]
很可能会出错。@BLUEPIXY:你当然是对的,但我的问题是,我发现这里的评论和公认的答案都非常不令人满意。该标准很少涉及数组和指向数组的指针之间的转换,我找不到任何东西可以说这是未定义的行为。是否要注释(或写一个更好的答案)?数组类型描述了一组连续分配的非空对象,具有特定的成员对象类型。
c
的类型是
指向数组大小3的指针,数组大小3的字符
。它的值与数组
a
衰减为的char
数组大小9的
指针相同。从一个到另一个是安全的,但据说是UB。看不到任何提示。是否要扩展您的答案?@david.pfx“其值相同”您的意思是,它们存储相同的内存地址,但类型不同
cout<<sizeof(char9); 
cout<<sizeof(char3x3);