Q如何声明一个指向数组的指针?
A通常,您不想这样做。当人们随意谈论指向数组的指针时,他们通常指的是指向其第一个元素的指针。
与其使用指向数组的指针,不如考虑使用指向数组某个元素的指针。类型为 T 的数组会退化为指向类型 T 的指针(请参见问题 6.3),这很方便;对退化后的指针进行下标访问或递增将访问数组的各个成员。真正的指向数组的指针,在进行下标访问或递增时,会跳过整个数组(见下文),并且通常只在操作数组的数组时有用,[脚注] 如果有用的话。(另请参见问题 6.18。)
如果您确实需要声明一个指向整个数组的指针,请使用类似“int (*ap)[N];”这样的声明,其中N是数组的大小。(另请参见问题 1.21。)如果数组大小未知,N原则上可以省略,但由此产生的类型“指向未知大小的数组的指针”是无用的。
这是一个示例,展示了普通指针和指向数组的指针之间的区别。给定声明
int a1[3] = {0, 1, 2}; int a2[2][3] = {{3, 4, 5}, {6, 7, 8}}; int *ip; /* pointer to int */ int (*ap)[3]; /* pointer to array [3] of int */您可以使用指向int, 的普通指针ip来访问一维数组:
ip = a1; printf("%d ", *ip); ip++; printf("%d\n", *ip);a1
0 1此片段将打印对指向数组的指针ap来访问一维数组:
ap = &a1; printf("%d\n", **ap); ap++; /* WRONG */ printf("%d\n", **ap); /* undefined */的尝试使用0将在第一行打印,在第二行打印一些未定义的内容(并可能导致崩溃)。指向数组的指针在访问数组的数组时才可能有用,例如a2:
ap = a2; printf("%d %d\n", (*ap)[0], (*ap)[1]); ap++; /* steps over entire (sub)array */ printf("%d %d\n", (*ap)[0], (*ap)[1]);最后这个片段将打印
3 4 6 7
另请参见问题 6.12。
附加链接: 进一步阅读
参考文献:ISO Sec. 6.2.2.1