现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

再论数组名a 和&a 之间的区别

2018-11-13 16:05 工业·编程 ⁄ 共 1414字 ⁄ 字号 暂无评论

int main()

{

   char a[5]={'A','B','C','D'};

   char (*p3)[5] = &a;

   char (*p4)[5] = a;

   return 0;

}

上面对p3 和p4 的使用,哪个正确呢?p3+1 的值会是什么?p4+1 的值又会是什么?毫无疑问,p3 和p4 都是数组指针,指向的是整个数组。

&a 是整个数组的首地址,a是数组首元素的首地址,其值相同但意义不同。在C 语言里,赋值符号“=”号两边的数据类型必须是相同的,如果不同需要显示或隐式的类型转换。p3 这个定义的“=”号两边的数据类型完全一致,而p4 这个定义的“=”号两边的数据类型就不一致了。左边的类型是指向整个数组的指针,右边的数据类型是指向单个字符的指针。在Visual C++6.0 上给出如下警告:

   warning C4047: 'initializing' : 'char (*)[5]' differs in levels of indirection from 'char *'。

还好,这里虽然给出了警告,但由于&a 和a 的值一样,而变量作为右值时编译器只是取变量的值,所以运行并没有什么问题。不过我仍然警告你别这么用。

既然现在清楚了p3 和p4 都是指向整个数组的,那p3+1 和p4+1 的值就很好理解了。

但是如果修改一下代码,把数组大小改小点,会有什么问题?p3+1 和p4+1 的值又是多少呢?

int main()

{

   char a[5]={'A','B','C','D'};

   char (*p3)[3] = &a;

   char (*p4)[3] = a;

   return 0;

}

甚至还可以把代码再修改,把数组大小改大点:

int main()

{

   char a[5]={'A','B','C','D'};

   char (*p3)[10] = &a;

   char (*p4)[10] = a;

   return 0;

}

这个时候又会有什么样的问题?p3+1 和p4+1 的值又是多少?

上述几个问题,希望读者能仔细考虑考虑,并且上机测试看看结果。

测试结果:

(1).char (*p2)[5]=a;必须使用强制转换,如:char (*p2)[5]=(char (*)[5])a;

(2).把数组大小改变,都会编译不通过,提示:

error C2440: 'initializing' : cannot convert from 'char (*)[5]' to 'char (*)[3]'

error C2440: 'initializing' : cannot convert from 'char (*)[5]' to 'char (*)[10]'

(3).把以上程序测试代码如下:

int main()

{

   char a[5]={'a','b','c','d'};

   char (*p1)[5]= &a;

   char (*p2)[5]=(char (*)[5])a;

 

   printf("a=%d\n",a);

   printf("a=%c\n",a[0]);

   printf("p1=%c\n",**p1);

   printf("p2=%c\n",**p2);

   printf("p1+1=%c\n",**(p1+1));

   printf("p2+1=%c\n",**(p2+1));

 

   return 0;

}

输出:

a=1638208

a=a

p1=a

p2=a

p1+1=?

p2+1=?

Press any key to continue

结论:

根据指针类型及所指对象表示指针大小,每次加1,表示增加指针类型大小的字节

给我留言

留言无头像?