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])实际上,UB低估了事情:它实际上也是错的。取消引用*c
=>1
,并评估1[0][0]
很可能会出错。@BLUEPIXY:你当然是对的,但我的问题是,我发现这里的评论和公认的答案都非常不令人满意。该标准很少涉及数组和指向数组的指针之间的转换,我找不到任何东西可以说这是未定义的行为。是否要注释(或写一个更好的答案)?数组类型描述了一组连续分配的非空对象,具有特定的成员对象类型。c
的类型是指向数组大小3的指针,数组大小3的字符
。它的值与数组a
衰减为的char
数组大小9的指针相同。从一个到另一个是安全的,但据说是UB。看不到任何提示。是否要扩展您的答案?@david.pfx“其值相同”您的意思是,它们存储相同的内存地址,但类型不同
cout<<sizeof(char9);
cout<<sizeof(char3x3);