C/C++指针笔记(1) - jues
JList
VC工程中添加lib库

C/C++指针笔记(1)

jues posted @ 2013年8月26日 12:06 in 笔记(原创) , 952 阅读

今天在百度上看到一个提问C语言指针的问题,问题如下

 

main() 
{
  int  a[6] = {1,2,3,4,5,6};
  int *ptr =  (int*)(&a+1);
  printf("%d\n" , *(ptr-1) );

}
请问输出为多少?请解释

从程序看来,应该是输出 1 ,很简单嘛,+1 然后 -1;

但运行结果却是6,这时你就有疑问了。

如果不懂的却又不怕我误导的朋友们,请往下看...

 

------------------------------------------------------------------------------------------------------

 

为什么C/C++的指针一直那么神奇,但我看来并不是指针的神奇,是对运算(控制)的不了解。

上面的程序如果改为

 

main() 
{
  int  a[6] = {1,2,3,4,5,6};
  int *ptr =  (int*)(a+1);
  printf("%d\n" , *(ptr-1) );

}

 

那答案就是之前你们想的一样是 1 。

 

这里的问题主要是类型转换问题,这里有人问了,这与类型转换有什么关系,请往下看。

当( a + 1 )时,因为a是一个数组,所以a这样的写法指向一个数组首地址指针,大小是 a[ 0 ] ,所以单位运算时 + 1就是向后移动一个 int 类型。

 

当( &a + 1 )时,因为a是一个数组,所以&a这样的写法指向一个数组首地址的首地址指针(不运算时输出的结果一样的),大小是 sizeof( a ) ,所以单位运算时 +  1 就是向后移动一个 sizeof( a ) 大小的类型。

 

测试:

#include <stdio.h>

void main() 
{
  int  a[6] = {1,2,3,4,5,6};
  int *ptr1 ;
  int i;
 // int *ptr2 =  ( int * )a;
  printf( "&a = 0x%X\r\n",&a );

  for ( i = 0;sizeof( a ) / sizeof( a[ 0 ] )  > i; i++ )
  {
	ptr1 =  (int*)( &a + i );
	printf( "&a + %d = 0x%X\r\n",i,( long )ptr1 );

	ptr1 =  (int*)( a + i );
	printf( "( a + %d = 0x%X )\r\n",i,( long )ptr1 );
  }

}

 

 

所以个人总结:

( a + 1 )  =  ( ( char* )a + sizeof( *a )  )


( &a + 1 )  =  ( ( char* )a + sizeof( *&a )  )

 

 

 

以上纯个人观点,只能在自己博客显显眼,如有误导,请多多包涵。

 

 

Avatar_small
krystism 说:
2013年8月26日 15:55

int main(int argc, char **argv)
{
int a[10];
int *p1, *p2;
p1 = a;
p2 = (int *)(&a + 1);
printf("sizeof(a) = %u\n", sizeof(a));
printf("p1 = %p, p2 = %p\n", p1, p2);
printf("p2 - p1 = %u\n", (unsigned)p2 - (unsigned)p1);
return 0;
}
&a + 1 移动一个a的大小字节


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter