请注意,C标准界定了<代码>main(>方案回归代码>int,而不是void/code>。
考虑到该守则:
#include <stdio.h>
int main()
{
char str[2][7] = {"1234567", "abcdefg"};
char** p = str;
printf("%d
", *(p+1));
printf("%c
", *(p+1));
return(0);
}
如用<条码>gcc-o x - Wall xx.c汇编,请示:
x.c: In function ‘main’:
x.c:5: warning: initialization from incompatible pointer type
x.c:6: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘char *’
x.c:7: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
(如果你略去-Wall
,你就没有接到格式警告。)
这告诉你,你正在通过一个点到<条码>。 印刷点并非完全有用。 然而,先前的警告也告诉你,你正在错开变代码<>p。 但是,净结果是<代码>p表示该空间在<代码>str上的开始。 页: 1
一个有趣的小rk子:通常,像“1234567”这样的插座包括一个终止的UNL
;在你的分光中,因为你明确指出,阵列的长度是7个,而不是8个,因此终止无效。 仔细阅读你的话!
该法典的另一变体是:
#include <stdio.h>
int main()
{
char str[2][7] = {"1234567", "abcdefg"};
char** p = str;
printf("%d
", *(p+1));
printf("%c
", *(p+1));
printf("%p %p %p -- %p %p %p
", str, &str[0], &str[0][0], p, p+1, *(p+1));
printf("%.4s
", (p+1));
return(0);
}
这给我带来了以下产出(来自澳门):
1631008309
5
0xbffffa5e 0xbffffa5e 0xbffffa5e -- 0xbffffa5e 0xbffffa62 0x61373635
567a
请注意,地址号、“座标”和“座标”;[0][0]和“座标”均具有相同价值,<代码>p+1是四条随附。 当作为护卫处理时,它用头脑最后三条 by和第二条 by印。
另外,对于以<代码>gcc -m64 -o x64 x.c汇编的电子数据,产出如下:
1701077858
b
0x7fff5fbff9e0 0x7fff5fbff9e0 0x7fff5fbff9e0 -- 0x7fff5fbff9e0 0x7fff5fbff9e8 0x676665646362
bcde