关闭

数组nice to see you again

标签: 内存数组a与a
715人阅读 评论(0) 收藏 举报
分类:
#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内存储存的内容!鬼知道编译器是怎么想的

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场