关于获取数组首地址的一个有关问题

关于获取数组首地址的一个问题
关于获取数组首地址的一个问题,可能有点弱智,问题如下:





int testfun(unsigned char* buf, int len)
{
  unsigned char arry[10] = {0};
 
  if( buf == NULL ) return -1;
  if( len <= 0 )return -1; 
  memcpy(arry, buf, len);//方式1
  memcpy(&arry, buf, len);//方式2
  return 0;
}




方式1和方式2是不是都可以,方式2是什么原理?今天在测试软件功能的时候,发现都可以。。。
------解决思路----------------------
printf("%p" 就可以看到了,同一地址,只是类型不同
------解决思路----------------------
你这个问题恐怕要参考C标准了。




int testfun(unsigned char* buf, int len)
{
  unsigned char arry[10] = {0};
 
  if( buf == NULL ) return -1;
  if( len <= 0 )return -1; 
  if (len>10) len=10;//小心驶得万年船
  memcpy(arry, buf, len);//方式1
  memcpy(&arry, buf, len);//方式2
  return 0;
}



------解决思路----------------------
参看:

对数组名取地址在 C 标准里面是未定义的。这个表达式曾经引起过争论,焦点在于对一个
右值取地址的合法性。 C89 规定&运算符的操作数必须具有具体的内存空间,换言之就是一
个左值,但数组名却是一个右值,按照&运算符的要求,这是非法行为。因此,早期的编译
器通常规定&a 是非法的。但不知道什么原因,现在的编译器都把&a 人为地定义成一个比 a
高一级而地址值跟 a 一样的地址,但作为比 a 高一级的地址,有一个行为却非常怪诞,
sizeof(&a)的结果跟 sizeof(a)相同,这也是人为的痕迹。笔者倾向于把&a 定义为非法,应该
维护&运算符的权威性,而不是在规定对某个右值取地址为非法的同时,又允许对另一个右
值取地址,这是互相矛盾的。
------解决思路----------------------
请参考K&R第二版附录A7.1 指针转换
 对于某类型T,如果某表达式或子表达式的类型为“T类型的数组”,则此表达式的值是指向数组中第一个对象的指针,并且此表达式的类型将被转换为“指向T类型的指针“。如果此表达式是一元运算符&或sizeof,则不会进行转换。