这都是关于静态类型检查和指针算法的。
也许最好通过一个具体的例子来说明。
考虑一下:
#include <stdio.h>
int main( int argc, char *argv[] )
{
char x[10];
char *p0 = &x[0]; /* ok */
int *p1 = &x[0]; /* <- type checking, warning #1 */
char (*p2)[10] = &x; /* ok */
int (*p3)[10] = &x; /* <- type checking, warning #2 */
(void)printf( "sizeof(char): %ld\n", sizeof( char ));
(void)printf( "sizeof(int): %ld\n", sizeof( int ));
(void)printf( "p0: %p, p0+1: %p\n", (void*)p0, (void*)( p0+1 ));
(void)printf( "p1: %p, p1+1: %p\n", (void*)p1, (void*)( p1+1 ));
(void)printf( "p2: %p, p2+1: %p\n", (void*)p2, (void*)( p2+1 ));
(void)printf( "p3: %p, p3+1: %p\n", (void*)p3, (void*)( p3+1 ));
return 0;
}
重要:用-Wall(gcc -Wall -o test test.c)编译
程序将编译,但您会收到两个关于指针类型不兼容的警告,这是正确的。
% gcc -Wall -o test test.c
test.c: In function ‘main’:
test.c:9:21: warning: initialization from incompatible pointer type [enabled by default]
int *p1 = &x[0]; /* <- type checking, warning #1 */
^
test.c:11:21: warning: initialization from incompatible pointer type [enabled by default]
int (*p3)[10] = &x; /* <- type checking, warning #2 */
^
现在运行程序:
% ./test
sizeof(char): 1
sizeof(int): 4
p0: 0x7fff9f6dc5c0, p0+1: 0x7fff9f6dc5c1 # + 1 char
p1: 0x7fff9f6dc5c0, p1+1: 0x7fff9f6dc5c4 # + 1 int (4 bytes here)
p2: 0x7fff9f6dc5c0, p2+1: 0x7fff9f6dc5ca # + 10 chars
p3: 0x7fff9f6dc5c0, p3+1: 0x7fff9f6dc5e8 # + 10 ints (40 bytes here)
在这里您可以观察到对指针运算的影响:虽然所有 4 个指针都被初始化为相同的值,但相同的操作会产生完全不同的结果。