指针与数组、大小端之 printf("%x,%x,%x\n",*(a+1),ptr1[-1],*ptr2);
在X86系统下,以下程序输出的值为多少?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a[]={,,,,};
int *ptr1=(int *)(&a+);
int *ptr2=(int *)((int)a+);
printf("%x,%x,%x\n",*(a+),ptr1[-],*ptr2);
system("pause");
return ;
}
执行以上代码,运行结果为:

分析:
&a+1:取数组a的首地址,该地址的值加上 sizeof(a) 的值,即:&a + 5 * sizeof(int),也就是下一个数组的首地址,显然当前指针已经越过了数组的界限。
*(a+1):a 和&a的值是一样的,但是意思不一样,a是数组首元素的首地址,(元素类型为int型,占四个字节,X86下为小端模式,因此首地址存放的是低字节数据) 即a[0]的首地址。
a+1 是数组下一个元素的首地址,即a[1]的首地址。所以 *(a+1) 输出 2。
&a是数组的首地址。 &a+1是下一个数组的首地址。
ptr1[-1]:因为ptr指向 a[5],ptr[-1]被解析为*(ptr-1),即ptr1往后退4字节,指向a[4],输出 5。
(int)a+1:将a[0]的首地址强制转换为 int 型,再加1,即两个 int 型数据相加,其值为a[0]第二个字节的地址。即(int)a + 1 指向图中的地址1,由于*ptr2是int类型,所以*ptr2代表从a[0]的第二个字节到a[1]的第一个字节的数据,
即下图中内存地址1到地址4的数据。由于X86下是小端模式,所以输出是2000000。

ps.以下为大小端模式测试程序
int checkSystem()
{
union check
{
int i;
char ch;
}c;
c.i = ;
return(c.ch==); //小端模式返回1,大端模式返回0
}
指针与数组、大小端之 printf("%x,%x,%x\n",*(a+1),ptr1[-1],*ptr2);的更多相关文章
- 经典笔试题:用C写一个函数测试当前机器大小端模式
“用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...
- 调试器地址出现大小端紊乱,引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
今天在编写一系列新增需求代码后,开始调试代码 发现上个版本正常可运行的代码出现了:引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突. 上个版本数代码 ...
- C语言随笔3:指针定义、数据在地址中的大小端排列
指针变量:用于存放另一个变量的地址 (指针变量所占空间大小由操作系统决定32/64位 4/8字节 // 声明且定义:int *p=&a: 声明.定义:int *p: p= &a: ...
- 转:浅谈C/C++中的指针和数组(一)
再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...
- C语言指针与数组的定义与声明易错分析
部分摘自<C语言深度解剖> 1.定义为数组,声明为指针 在文件1中定义: char a[100]; 在文件2中声明: extern char *a; //这样是错误的 这里的extern告 ...
- str*函数和大小端判断
#include <stdio.h> #include <assert.h> size_t mstrlen(const char *s) { assert(s != NULL) ...
- C语言的本质(11)——指针与数组
1.指针数组和数组指针的内存布局 初学者总是分不出指针数组与数组指针的区别.其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是"储存指针的数组 ...
- 浅谈C中的指针和数组(四)
原文转载地址:http://see.xidian.edu.cn/cpp/html/476.html 在原文的基础上增加自己的思想作为自己的修改 指针数组和数组指针的内存布局 初学者总是分不出指针数组与 ...
- 浅谈C中的指针和数组(一)
本文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 在原文的基础上加入自己的想法作为修改. 指针是C/C ...
随机推荐
- 转:Visual C++ sprintf()函数用法
将字串格式化命令.sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访 问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情 ...
- NGINX结合SHELL统计用户的UV及IP汇总
公司新的需求,怀疑PV和IP的比例不对,看是不是有恶意的东东: NGINX配置: log_format main '$remote_addr - $remote_user [$time_local] ...
- HDU5266---pog loves szh III (线段树+LCA)
题意:N个点的有向树, Q次询问, 每次询问区间[L, R]内所有点的LCA. 大致做法:线段树每个点保存它的孩子的LCA值, 对于每一次询问只需要 在线段树查询即可. #include <bi ...
- URAL 2034 : Caravans
Description Student Ilya often skips his classes at the university. His friends criticize him for ...
- linux系统下mySQL数据库 备份方法和脚本
数据库备份1.创建个备份存储目录mkdir /root/backup/2.以下内容写到dbbackup.sh #!/bin/bash cd /data/db_backup/mysqldump -uad ...
- INTELLIJ IDEA集成CHECKSTYLE(转)
转自:http://www.cnblogs.com/kiwi-wang/p/4166410.html 本文中使用intelliJ IDEA版本为14.0.1,其他版本差异不大,可同样安装. 下载安装C ...
- RequireJS入门(三)
这篇来写一个具有依赖的事件模块event.event提供三个方法bind.unbind.trigger来管理DOM元素事件. event依赖于cache模块,cache模块类似于jQuery的$.da ...
- HTML5 API's (Application Programming Interfaces)
New HTML5 API's (Application Programming Interfaces) The most interesting new API's are: HTML Geoloc ...
- 将16进制颜色转换成UIColor-ios
-(UIColor *) hexStringToColor: (NSString *) stringToConvert { NSString *cString = [[stringToConvert ...
- Linux菜鸟学习笔记--Linux系统结构
什么是Linux? Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核.严格来讲,Linux这个词本身只表示Linux内核,但实际上人 ...