2 gkc v GKC_V 于 2016.03.09 21:50 提问

【C语言】为什么指向char整数数组的char*相减得到的是long类型?

图片说明

5个回答

u010319440
u010319440   2016.03.09 21:56

事实上, char *p,*p1都是指针,一个指向数组第一个元素,一个指向第五个元素,指针的减法表示地址之间的差,而这是指向char的指针,因此得到的是两地址差/8的值,即sizeof()

qq_21792169
qq_21792169   2016.03.10 10:33

你测试一个问题的时候 把结果贴出来 方便解决

chen956
chen956   2016.03.10 10:53

指针运算得出的结果与指针指向的类型和系统位数有关。比如上述例子:p和p1指针指向的都是char,那么指针运算的单位是一个字节长度。
根据上述例子知道p的值是char数组的首地址,p1的值是char数组的第五个元素的地址,那么p1-p的结果应该是5x1(char型的字节长度)=5(32位系统)。
经过测试的确是5,long型的字节长度是4,并不是long型的字节长度。

John_ToStr
John_ToStr   Rxr 2016.03.10 15:05

指针相减得到的是偏移量,而你用的是%d输出的,所以是正形10进制数据

qilimi1053620912
qilimi1053620912   2016.03.11 18:59

这个要从内存来看的话,首先,指针里面存的值是地址,不同于char a这种,a表示的是a的地址里面的值,因为a是char,
只占一个字符,char相减得到的也就是一个字符。
现在来看指针,我们都知道32位对应的是4位,它的最小字段都是4个字节,这是内存对其,因为4位可以访问我32为系统的内存中任意位置,
所以这个指针也就只要4位,然后两个四位的数据相减得到的肯定是4位,在32位系统中long是4位的。
对于64位就对应的是8位,但是一般写程序都是默认32位,因为向上兼容。向下不兼容,这个大家都知道。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
char**的加减法
注意:带*/**类型的加减法 例子1:      char* a ;     char* b;     a = (char*)100;     b = (char*)200;     b-a的值为100 例子2:     char** a ;     char** b;     a = (char**)100;     b = (char**)200;
指针相减(同类型与不同类型)
前言:本文是转载的,但由于转载地址仍然是转载的,所以不知原文出处,对此表示抱歉,但仍对原作者表示深深的敬意!!!谢谢!!      如果两个指针指向同一个数组,它们就可以相减,其结果为两个指针之间的元素数目。      假设我住在广场路124号,Mag住在广场路142号,每家之间的地址间距是2(在我这一侧用连续的偶数作为街道地址),那麽Mag家就在我家往前(142-124)/2家,也
C语言int类型指针指向char类型变量简单实例
首先看段代码: int b = 12; int *p = &b; //指针变量p指向变量b printf("%p\n",p);//指针p保存的b的地址 printf("%p\n",&p);//指针变量b本身的地址 char a ='b';    printf("%p\n",&a); int *p2 =&a; //int类型指针变量p2 指向
关于如何将char*转换成long型整数
<br />在计算机中,long型数占4个字节,每个字节中存储相应的二进制数据,我们做以下测试,就可看出高低位顺序及每个字节存储的内容,<br />  char a[5];<br />  long b = 1;<br />  memcpy(a, (char *)&b, 4 );<br />我在winxp下vs08做实验,得到long的高低位顺序为a[3],a[2],a[1],a[0],之后我们对于题目的问题就非常容易了。<br />例如将char* str中的字节转化成long i;可用如下代码:memcp
char型和long型的转换
才开始做C语言嵌入式开发,遇到了不少的问题。其中,char型的数组和long型之间的转换困了一些日子。   做英飞凌单片机的开发,用到了存储卡的功能。在存储卡中存放了有效数据的总长度之类的信息。封装了一个函数read(char *  ch,long numer,char * ch0)读取出来的长度信息是一个char*的数组,如何能将其转换为long型的,困惑了2个小时。汗颜啊,不过还是找到两种
C经典 Char型指针数组与字符数组的区别
1.char 类型的指针数组:每个元素都指向一个字符串,指向可以改变char *name[3] = { "abc", "def", "gbk" }; for(int i = 0 ; i < strlen(name); i ++){ printf("%s\n", *(name+i)); //printf("%s\n", name[i]); }//指向改变 n
C语言 char转long int
该问题是在工作中 需要把 一逻辑编号转到物理IMEI编号  一个起始的IMIE 也就是 char buf[]; 逻辑编号 是short型  但是 要根据逻辑编号自动生成相应的物理编号。 数组中的 是以BCD码形式存储的 需要 从BCD码转到字符串。   转换完成后翻转数组  然后进行 内存拷贝 然后进行运算 然后在拷贝 翻转   int main(void) { int i; unsig
指针指向字符串常量和数组存放字符串常量(char *p="abcd", char p[]="abcd")
指针指向字符串常量和数组存放字符串常量(char *p=”abcd”, char p[]=”abcd”)代码结果分析 fun()函数 首先abacd字符串是在静态常量区分配的内存,然后指针c在栈里分配的内存,然后将指针指向”abacd”所在的内存块。所以程序结束后,返回的是指针c的内容,指针里存放的都是什么???地址。在fun()函数中,c存放的是”abacd”的地址,而这个地址所在内存是在静态常
C语言中基本类型char、short、int、long等类型的取值范围
在C语言中,有时候会想知道这些基本类型的取值范围。用逻辑位操作的方法是可以,比如把整型变量的所有位都赋值1,然后把最高位赋值为0,就可以得到整型的最大值了。         其实,还有一个更简单的方法获取这些基本类型的取值范围。那就是使用系统头文件limits.h。这个头文件用宏定义了这些基本类型的最大和最小值。但没有为double类型定义。下面贴出这些宏的定义。 /* Number
C语言数据类型打印对应的占位符
占位符列表 char                          %c和%hhd unsigned char                 %c和%hhu %c对应字符身份,%hhd和%hhu对应数字身份 short                         %hd unsigned short                %hu long