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]);
printf("a...%p\nc...%p\n", a, c);
}
a和c都指向相同的位置?不应该是一个双层指针,而是一个指向内存中某个位置的指针吗?
答案 0 :(得分:2)
变量
a
指向内存中具有9个整数的位置。
没有。变量a
是内存中的一个位置,连续有9个整数。 a
只是该位置的名称。
c指向内存中指向内存中连续保存9个整数的位置的位置吗?
没有。 c
是内存中的一个位置,它指向内存中一个连续保存9个整数的位置。 c
是包含指针的位置的名称。
那么,从技术上讲,是单层指针还是双层指针?
单
答案 1 :(得分:0)
看看这些类型定义:
typedef char9[9];
typedef char3x3[3][3];
如果我们检查尺寸:
cout<<sizeof(char9);
结果将始终为9,char数组中没有对齐。
cout<<sizeof(char3x3);
如果它等于9,可以说有序字节与一维数组相同。 如果它大于9,我会说行之间有对齐,所以行之间有空洞,然后你不能将一种类型的指针映射到另一种。