C/C++指针笔记(1)
jues
posted @ 2013年8月26日 12:06
in 笔记(原创)
, 1120 阅读
今天在百度上看到一个提问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 ) )
以上纯个人观点,只能在自己博客显显眼,如有误导,请多多包涵。
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的大小字节