指针与数组

一、什么时候数组和指针是相同的
1、表达式中的数组名(与声明不同)被编译器当作一个指向该数组第一个元素的指针
因此如a[i]这样的访问都被编译器改写或解释为*(a+i)的形式,同样取下标操作符的操作数是可交换的,所以a[3]可以写成3[a],不过通常你不会这样做。

2、下标总是与指针的偏移量相同,下标*sizeof(元素类型)就是偏移数组起始地址的实际字节数。

3、“作为函数参数的数组名”等同于指针,任何传递给函数的数组参数都会被转换成指针,这是基于效率考虑,避免了数组的拷贝。在函数内部,数组参数都将被转换成一个指针,要牢记这一点,因此如:
void  test( char  a[ 10 ])
{
   printf(
" %d\n " , sizeof (a));
}

显然应该打印指针大小4,而非数组大小。另外,注意数组参数的地址跟数组参数第一个元素的地址并不相等,在表达式中两者一致,但是在函数调用中,由于数组参数指针也是临时变量,因此两者的地址是不一样的。
可以通过下列程序观察:

#include  < stdio.h >
#include 
< stdlib.h >
void  test1( char  a[])
{
    printf(
" &a=%x,&(a[0])=%x,&(a[1])=%x\n " , & a, & (a[ 0 ]), & (a[ 1 ]));
}
void  test2( char   * b)
{
    printf(
" &b=%x,&(b[0])=%x,&(b[1])=%x\n " , & b, & (b[ 0 ]), & (b[ 1 ])); 
}
int  main( int  argc,  char   * argv[])
{
  
char  ga[] = " hello " ;
  printf(
" &ga=%x,&(ga[0])=%x,&(ga[1])=%x\n " , & ga, & (ga[ 0 ]), & (ga[ 1 ])); 
  test1(ga);
  test2(ga);
  system(
" pause " );
  
return   0 ;
}


二、指针跟数组什么时候不同
1、如果定义了一个数组,在其他文件对它进行声明也必须声明为数组,定义和声明必须匹配,指针也是如此。
2、指针始终是指针,它绝不可以写成数组。可以用下标形式访问指针的时候,一般都是指针作为函数参数时,并且你知道传递给函数的实际是一个数组。
3、数组名是不可改变的左值,因此如
int  array[ 100 ],array2[ 100 ];
array
= array2;
array++;
array--;
 
都将出错,但是在函数内部:

int  array2[ 100 ];
void  fun( int  array[])
{
  array
= array2;
}

却可以,因为在函数内部array虽然被声明为数组实际上却是指针。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值