求助,关于指针和指向指针的指针

来源:百度知道 编辑:UC知道 时间:2024/05/23 22:55:38
下面这两个为什么会产生这样的结果,麻烦从原理上讲清楚一点
#include "stdio.h"
main(int c,char **v)
{
int a,b,d;
for (d=0;d<c;d++)
printf ("a is %s\n",*(v+d));
}
DOS下运行out 2222 cab结果是
a is C:\TURBOC2\C\\OUT.EXE
a is 2222
a is cab
#include "stdio.h"
main(int c,char *v)
{
int a,b,d;
for (d=0;d<c;d++)
printf ("a is %s\n",*(v+d));
}
DOS下运行out 2222 cab结果是
a is C:\TURBOC2\C\\OUT.EXE
a is
a is 2222

第一个显然是正确的。第二个的效果完全等价于:
main(int c,char **actual_v)
{
char * v = (char*)actual_v;
int a,b,d;
for (d=0;d<c;d++)
printf ("a is %s\n", (char*)(*(v+d)));
}

根据你试验的结果看,存在如下3个事实:
char指针是16位的,
CPU是little-endian,
命令行的3个字符串的首地址不超过0x00ff.

第一个main中,v+d所指向的地址实际上相对于v指向的地址偏移了2*d字节;
而第二个main中,则偏移了1*d字节。