问题一:
首先,因为我没有 malloc,所以这仍然保留在堆栈中,对吗?
指针在堆栈上声明,但它还没有指向任何东西。您需要执行以下操作:
char (*a)[10];
char array[10];
a = &array;
否则a不指向任何东西,并且试图访问它会导致问题。
现在,如果我想访问数组中的第二个元素,我还会做*(a+2*sizeof(char))
您不需要说sizeof(char),因为编译器会使用您正在使用的指针或数组的类型为您计算加法的大小。此外,如果您想要第二个元素,则需要添加 1 而不是 2(因为数组/指针索引从零开始)。
问题2:
(下次最好打开多个问题:)
如果我想从整数数组中获取第二个字节,我会这样做*((char*)((char*)a+2)):
首先,当你说:
int* a = malloc(10*sizeof(int));
您有一个指向内存块的指针,该内存块有足够的空间容纳 10 个整数 - 这不是一个数组。如果这令人困惑,请参阅指针和数组的 C-FAQ。
现在,如果你想要 a 指向的内存块中的第二个字节,你可以说:
char second_byte = *((char*)a+1);
因为强制转换的优先级高于加法,所以在执行加法时a被视为 a char*。但是,为了尽量减少阅读代码时产生误解的机会,我可能会写:
char second_byte = *(((char*)a)+1);
或更好:
char second_byte = ((char*)a)[1];
反而。请注意,原始示例中的额外演员表是不必要的。