2 qq 28839381 qq_28839381 于 2015.07.17 13:53 提问

数组名进行类型强制转换的问题

int main(void)
{
int a[4] = {1, 2, 3, 4};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x, %x/n", ptr1[-1], *ptr2);
return 0;
}

为什么ptr2指向a[0]的第二个字节?
个人理解是数组名a是指向a[0]的指针,强制转换为int型变量,再加1,就相当于将原来所存放a[0]的地址当作一个int型数,再进行加1的算术运算,再强制转换为int型指针。请问是这样理解的吗?

5个回答

arronbnm
arronbnm   2015.07.17 14:21

思路正确。在32机上可以实现预期。

mlj1668956679
mlj1668956679   2015.07.17 16:11

数组名a是数组的首地址没错,另外明确的是它是一个int型的指针,如果指针直接进行++操作,一次跳跃的是4个字节。
但你先把指针强转成一个整形数,虽然这也没错,因为指针本来就是一个整型值,但是你加1这时候是往后移动了一个字节。明白否?

arronbnm
arronbnm 指针是long,所以64bit机器的话,就不一样了。
接近 3 年之前 回复
mlj1668956679
mlj1668956679   2015.07.17 16:11

数组名a是数组的首地址没错,另外明确的是它是一个int型的指针,如果指针直接进行++操作,一次跳跃的是4个字节。
但你先把指针强转成一个整形数,虽然这也没错,因为指针本来就是一个整型值,但是你加1这时候是往后移动了一个字节。明白否?

Arnold9009
Arnold9009   2015.07.17 18:20

这不是一个好习惯。。。指针加1和数值加1是不一样的。。。。

arronbnm
arronbnm   2015.07.17 21:42

真想实现这种功能的话。union { int a; char b[4];}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言数组、指针强制类型转换
今天在写到代码的时候,因为要将数据写入到flash中去,这块flash规定每次写入两个字节,然后发现了一个挺好玩的事情,那就是类型强制转换。 通过测试发现char类型强制转换成short或者int类型时候,会由原本占据1Byte的数据,变成了占据2Byte的数据或者4Byte的数据。同样,指针类型的也一样,char*类型的指针,通过强制转换成了short*或者int*类型的指针,也会由原来指向1B
强制类型转换与内存对齐问题小结
C语言强制类型转换       概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的
as和强制类型转换的区别
之前一直以为as就是强制类型转换,只是as是AS3中新的语法,之前用在有继承关系的对象之间的转换也无甚区别,但是今天却让我领悟到了它俩之间的区别。 原起:今天要给ColorPicker控件动态赋值,它的selectedColor属性接收的是一个uint属性,而我要从另一个对象中拿过来的属性是String的,理所当然的我写了如下的代码: 经过: var color:uint = str a
利用指针进行类型强制转换(c指针详解)
今天看《C指针详解》(好像也有叫《深入理解c指针》的)的时候,看到一个有关类型转换的例子。    例十六:                  第一眼看到这个例子的时候,我原本以为这个函数的功能是要将整型数字125进行倒置转换的,如125变作521,于是写了对历程进行了一下修改 #include void fun(char *s) {      char c;      c=*(s+3
JAVA强制类型转换常见错误
这篇文章主要讲解:JAVA强制类型转换经常遇到的问题,主要分为2种情况。 1、当两个类没有继承关系时: package Test; public class Test { public static void main(String []args) { C c = new C(); B b = (B) c; } } class B extends A { public voi
JAVA强制类型转换总结
object对象转换为String的一些总结 -------------------------------------------------------------------------------- 在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能。本文将对常用的转换方法进行一个总结。常用的方法有Object.toString(),(Stri
数组强制转换成结构体指针
今天看公司代码,遇到一个数组指针强制转换成结构体指针的地方,就在想这样做的结果会是什么,和别人讨论了一下。得到结果是,这样做是让结构体按照自己的属性重新读取数组中的数据, 字节对齐 如果结构体中所有属性所占字节和数组的类型所占字节一样(如果数组类型是16位的,属性也是16位的),那就直接按照属性的顺序,将数组中的数据依次读取出来(是读取,不是复制,因为是指针强制转换) 字节不对齐 如果结构
C引用数组名时的含义与数组元素访问
数组名在纯被引用时它的含义是指向数组第一个元素的指针常量。 1 一维数组 1.1 表达式中的数组名 当定义一个一维数组后,元素以地址连续的形式存储在内存中。当在程序的表达式中引用数组名时它被当成指向数组第一个元素的指针常量。
关于MVC中无法将类型为“System.Int32”的对象强制转换为类型“System.String”的问题。
关于MVC中无法将类型为“System.Int32”的对象强制转换为类型“System.String”的问题。出现这种问题会导致在调用方法的时候传递模型不能调转到方法。遇到这个问题的时候也把我捣鼓了很久,原因就是无法进入到断点,进行调试也找不到根本的原因。最后想到了模型当作参数的时候都需要先进行模型验证,结果就出现了这种问题。以后尽量少ctrl+c……. 主要问题出在MVC的强大之处。模型验证
Java 强制类型转换(类转换注意事项)
将一个类型强制转换成另一个类型的过程被称为类型转换.例如: double x =3.14; int y = (int)x;将表达式x的值转换成整数类型,舍弃小数部分. 有时候也可能是类的对象引用的转换. 譬如:  Manger boss = (Manger)staff[0]; 我们知道如果将一个子类的引用赋给一个超类变量,是可以的. 但是反过来,必须进行类型转换. 但是转换的时候,可能