编译后数组和指向数组的指针之间的区别?

时间:2014-08-27 02:46:17

标签: c++ c arrays pointers

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都指向相同的位置?不应该是一个双层指针,而是一个指向内存中某个位置的指针吗?

2 个答案:

答案 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,我会说行之间有对齐,所以行之间有空洞,然后你不能将一种类型的指针映射到另一种。