您的位置:首页 > 大数据 > 人工智能

数组nice to see you again

2013-12-03 19:45 357 查看
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) 
{
	int a[5]={1,2,3,4,5};
	int *ptr1=(int *)(&a+1);
	int *ptr2=(int *)((int)a+1);
	printf("%d,%d",ptr1[-1],*ptr2);
	return 0;
}

上测试程序来自《C语言深度解析》中的一个习题:

分析如下:

先打印出结果:



格式符变一下;;;;

printf("%d,%p",ptr1[-1],*ptr2);




ptr1[-1]结果为5,很显然,这个表达式看上去乖乖的,但是编译器并未报错 运行正常,,个人认为这个结果完全正确!

ptr1指针指向数组最后一个元素接下来的那个地址,ptr1[-1]这里ptr1相当于数组名a的作用,-1就往后退一个数组元素大小的内存单元,也就是a[4]所在的地址单元

输出5是正确的!

*ptr2 = 2???不!!!!

(int)a+1与a+1是完全不同的两个东西。你区分明白了木有。。。。

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[])
{
int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%p\n",(int *)(int)a+1);//0022ff28
printf("%d,%p",ptr1[-1],*ptr2);
return 0;
}


*ptr2的值就是内存单元0022ff28内存储存的内容!鬼知道编译器是怎么想的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: