精华内容
下载资源
问答
  • 指针减法运算规则

    千次阅读 2021-03-29 23:47:51
    指针与整数相加: 可以使用 + 运算符把指针与...指针必须是第一个运算对象。整数是第2个运算对象。该整数将乘以指针指向类型的大小(以字节为单位),然后相减的结果超出了初始指针所指向数组的范围,计算结果则是未定

    一、指针与整数相加: 可以使用 + 运算符把指针与整数相加,或整数与指针相加。无论哪种情况,整数都会和指针所指向类型的大小(以字节为单位)相乘,然后把结果与初始地址相加。如果相加的结果超出了初始指针指向的数组范围,计算结果则是未定义的。除非正好超过数组末尾第一个位置,C保证该指针有效。

    使用举例:

    #include <stdio.h>
    
    int main(void) { 
        int urn[5] = {100,200,300,400,500};
        int *ptr1,*ptr2,*ptr3;
        
        ptr1 = urn;	//将数组首地址赋给指针
        ptr2 = &urn[2];	//将数组中第三个元素的地址赋给指针
        
        //指针加法
        ptr3 = ptr1 + 4;
        printf("ptr1 = %p , ptr3 = %p , *ptr3 = %d", ptr1,ptr3,*ptr3);
    
    
    	return 0;
    }
    
    

    运行结果:
    ptr1 = 0x7ffc62e2bec0
    ptr3 = 0x7ffc62e2bed0 ==> ptr3 = ptr1+4 = ptr1地址+4*sizeof(int)
    *ptr3 = 500
    在这里插入图片描述

    二、指针减去一个整数: 可以使用 - 运算符从一个指针中减去一个整数。指针必须是第一个运算对象。整数是第2个运算对象。该整数将乘以指针指向类型的大小(以字节为单位),然后相减的结果超出了初始指针所指向数组的范围,计算结果则是未定义的。除非正好超过数组末尾第一个位置。C保证该指针有效。

    使用举例:

    #include <stdio.h>
    
    int main(void) { 
        int urn[5] = {100,200,300,400,500};
        int *ptr1,*ptr2,*ptr3;
        
        ptr1 = urn;	//将数组首地址赋给指针
        ptr2 = &urn[4];	//将数组中第五个元素的地址赋给指针
        
        //指针加法
        ptr3 = ptr2 - 3;
        printf("ptr2 = %p , ptr3 = %p , *ptr3 = %d", ptr2,ptr3,*ptr3);
    
    
    	return 0;
    }
    

    运行结果:
    ptr2 = 0x7ffdaa100d20
    ptr3 = 0x7ffdaa100d14   =>  ptr3 = ptr2 地址 - 3*sizeof(int);

    *ptr3 = 200

    在这里插入图片描述

    三、指针求差: 可以计算两个指针的差值。通常,求差的两个指针分别指向同一个数组的不同元素,通过计算求出两元素之间的距离。差值的单位与数组类型的单位相同。ptr2-ptr1得2,意思是这两个指针所指向的两个元素相隔两个int,而不是2字节,只要两个指针都指向相同的数组(或者其中一个指针指向数组后面的第1个地址),C都能保证相减运算有效。如果指向两个不同数组的指针进行求差运算可能会得出一个值,或者导致运行时错误。

    使用举例:

    #include <stdio.h>
    
    int main(void) { 
        int urn[5] = {100,200,300,400,500};
        int *ptr1,*ptr2,n;
        
        ptr1 = &urn[2];	
        ptr2 = &urn[4];	
        
        //指针加法
        n = ptr2 - ptr1;
        printf("ptr2 = %p , ptr1 = %p , n = %d", ptr2,ptr1,n);
    
    	return 0;
    }
    

    运行结果:
    ptr2 = 0x7fff9820f020
    ptr1 = 0x7fff9820f018
    n = 2

    在这里插入图片描述

    PS:这里在放一个在线编译工具:菜鸟工具

    展开全文
  • 指针加减运算理解

    2018-02-09 23:03:03
    它内部实现的是:(p的地址-q的地址)/sizeof(int)指针之间加法运算p+q 为错误的,因为加法运算时,如果两个内存离得很远,那得到的地址到底是往p下面延伸,还是往q下面延伸呢,所以没意义。...

    指针间的减法运算就是求指针之间目标个数(数据类型必须相同)

    int *p;

    int *q;

    p-q   <==>它内部实现的是:(p的地址-q的地址)/sizeof(int)


    指针之间加法运算p+q  为错误的,因为加法运算时,如果两个内存离得很远,那得到的地址到底是往p下面延伸,还是往q下面延伸呢,所以没意义。

    展开全文
  • C语言指针变量的自增自分析(指针的算数运算

    千次阅读 多人点赞 2018-09-08 16:19:29
    前言 ...2. 指针变量是地址,指针变量的加减是地址的加减, 举例说明: 假设:整型指针变量p指向整型数组a的首元素;(p = a) 分析: 1) p++; //p自加,使自己指向先一个元素a[1] 2)...

    前言

    1. 本博文中的代码基于VC++6.0开发调试;
    2. 只是对于指针这一节知识中指针变量的算数运算的小结,并不包含指针所有内容,太简单的道理也不过多说了;

    指针变量和加减分析

    首先先明白几个基础点:
    1. 指针变量是没有乘除运算的;
    2. 指针变量是地址,指针变量的加减是地址的加减;
    3. *也是一个运算符;

    举例说明:
    假设:整型指针变量p指向整型数组a的首元素;(p = a)
    分析:
    1) p++ 地址的算数运算

    p++;   //p自加,使自己指向先一个元素a[1];

    2) * *p++; 先取值后++*

    #include <stdio.h>
    void main()
    {
        int a[]={1,2,5,3,8,9,6};
        int *p = a;
        printf("p的起始地址:%d\n",p);
        printf("*p++ = %d\n",*p++);
        /*
    *和++的优先级相同,运算顺序从右向左,所以*p++就相当于*(p++);
    这里存在一个知识误区:本应该先执行括号内的p++,使p从指向a[0]变成指向a[1];
    但其实事实并非如此;事实是,对于直接对*p++的输出来说,第一步是运算*p,输出后,第二步再运算p++;
    需要注意的是:*和++对于p的运算,都是单独运算,比如第一步:*p就是对p所指向的地址进行取值,第二步:p++对于p所指向的地址+1个数据类型的字节数;
    */
        printf("*p++后的地址:%d\n",p);
        printf("*p的值是:%d\n",*p);
        printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);
    }

    输出结果:
    这里写图片描述

    3) * (++p) ; 先++再取值**

    #include <stdio.h>
    void main()
    {
        int a[]={1,2,5,3,8,9,6};
        int *p = a;
        printf("p的起始地址:%d\n",p);
        printf("*(++p) = %d\n",*(++p));
        /* 此次运算其实可以和上次运算相比较,*p++先取值再加地址,*(++p)是先加地址再取值;
        总的来说分两步:第一步:先对p进行加地址得到(p+1);第二步:对(p+1)所指向的地址进行取值;
        */
        printf("*(++p)后p的地址:%d\n",p);
        printf("*p的值是:%d\n",*p);
        printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);
    }

    运行结果:
    这里写图片描述

    4) ++(*p) 和 (*p)++ p所指向数据的算数运算;(这个倒是并不能理解)
    ++(*p) :

    #include <stdio.h>
    
    void main()
    {
        int a[]={1,2,5,3,8,9,6};
        int *p = a;
        printf("p的起始地址:%d\n",p);
        printf("++(*p) = %d\n",++(*p));
        printf("++(*p)后p的地址:%d\n",p);
        printf("*p的值是:%d\n",*p);
        printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);
    }

    运行结果:
    这里写图片描述

    (*p)++:

    #include <stdio.h>
    
    void main()
    {
        int a[]={1,2,5,3,8,9,6};
        int *p = a;
        printf("p的起始地址:%d\n",p);
        printf("(*p)++ = %d\n",(*p)++);
        printf("(*p)++后p的地址:%d\n",p);
        printf("*p的值是:%d\n",*p);
        printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);
    }

    这里写图片描述

    总结

    假设:整型指针变量p 指向 整型数组元素a[i];i为a数组下标(i>0);

    表达式含义运算顺序输出的结果%d
    p++地址自加&a[i]
    ++p地址自加&a[i+1]
    *p++取值,地址自加先取值,再自加地址自加&a[i]
    *(p++)取值,地址自加先取值,再自加地址自加&a[i]
    ++(*p)++a[i]先取值,再变量值自加a[i]+1
    – -(*p)–a[i]先取值,再变量值自减a[i]-1
    (*p)++a[i]++先取值,再变量自加a[i]
    (*p)- -a[i]–先取值,再变量自加a[i]
    展开全文
  • 加减规则:指针加减法需要调整。调整的权重是指针本身去掉一个*号,再求sizeof();加法示例: int *p = (int *)1000; //定义一个整型指针变量p赋值为16进制数0x1000; printf("%d\n",p+2);//1008 //...

    数据类型必须是严格相同的,才可以赋值的。


    1.指针的加减数字 指的是指针在数组中的位置移动

    2.加减规则:指针加减法需要调整。调整的权重是指针本身去掉一个*号,再求sizeof();



    加法示例:



     int *p = (int *)1000; 

    //定义一个整型指针变量p赋值为16进制数0x1000;


     printf("%d\n",p+2);//1008 

    //去掉一个*,属于int型,sizeof(int)是4,即1000+2*sizeof(int) = 1008;


     printf("%d\n",(char ***)p+2);//1008

    去掉一个*,为char**,二维指针,sizeof()为4,1000+2*4 = 1008;


     printf("%d\n",(short *)p+2);//1004

    去掉一个*,属于short型,sizeof()为2,1000+2*sizeof(short) = 1004;


     printf("%d\n",(double **)p+2);//1008

    去掉一个*,还是指针变量,sizeof()为4,1000+2*4 = 1008;


     printf("%d\n",(unsigned long *)p+2);//1008

    去掉一个*,属于unsigned long,sizeof()为4,1000+2*sizeof(unsigned long) = 1008;


     printf("%d\n",(char *)p+2);//1002

    去掉一个*,属于char型,sizeof()为1,1000+2*sizeof(char) = 1002;


     printf("%d\n",(unsigned long long)p+2);//1002

    不是指针变量,不用求sizeof,直接1000+2 = 1002;

    法示例:


    //定义一个整型指针变量p赋值为16进制数0x1000;

         int *p = (int *)0x2010;     //转换为二进制该数10两位是16


     printf("%x\n",p-2);//2008

    //去掉一个*,属于int型,sizeof(int)为4,那么为2016-2*sizeof(int)=2008;


     printf("%x\n",(float *)p-2);//2008

    // 去掉一个*,属于float型,sizeof(float)为4,那么2016-2*sizeof(folat) = 2008


     printf("%x\n",(double *)p-2);//2000

    //去掉一个*,属于double型,sizeof(double)为8,2016-2*sizeof(double) = 2000


     printf("%x\n",(short *)p-2);//200c

    //去掉一个*,属于short型,sizeof(short)为2,2016-2*sizeof(short) = 200c


     printf("%x\n",(unsigned long *)p-2);//2008

    //去掉一个*,属于unsigned long型,sizeof()为4,那么2016-2*4 = 2008;


     printf("%x\n",(long *)p-2);//2008

    去掉一个*,属于long型,sizeof(long)为4,那么2016-2*sizeof(long) = 2008


     printf("%x\n",(long long)p-2);//200e

    其不是指针变量,所以直接2016 - 2 = 2014,十六进制用200e表示


     printf("%x\n",(char *)p-2);//200e

    去掉一个*,属于char型,sizeof(char)为1,2016-2*sizeof(char)=200e;


    指针+指针是非法的


    指针-指针:

    //指针-指针:间隔的单元个数,需要调整,调整的权重位sizeof(指针去掉一个*)
    //指针-指针的计算:1、计算间隔的字节数,2、除以权重


         int arr[10] = {0};
     int *p = &arr[1];//x+4
     int *q = &arr[7];//x+28


     printf("%d\n",p-q);//-6

    p-q的间隔字节数为-24,-24/sizeof(int) = -6


     printf("%d\n",q-p);//6

    q-p的间隔字节数为24,24/sizeof(int)= 6


     printf("%d\n",(short *)q-(short *)p);//12

    q-p的间隔字节数为24,24/sizeof(short)= 12


     printf("%d\n",(long long*)q-(long long *)p);//3

    q-p的间隔字节数为24,24/sizeof(long long )= 3


     printf("%d\n",(double *)q-(double *)p);//3

    q-p的间隔字节数为24,24/sizeof(double)= 3


     printf("%d\n",(unsigned long)q-(unsigned long)p);//24

    其不是指针变量,直接q-p即可,即答案为24;


     printf("%d\n",(char **)q-(char **)p);//6

    q-p的间隔字节数为24,去掉一个*,char*为指针变量,占有4个字节,即24/4 = 6;




    展开全文
  • 指针的自增运算具体代表什么?

    千次阅读 2018-03-25 18:08:46
    今天我们就指针 p 的自增运算来作为我们的第一步基石。在说指针之前,我们说说整形变量 i 的自增,对于整形变量 i 它的值域是表示一个整数值,所以自增就是 i 变量加一,另外自增说到底是一个预算符,所以在这里我们...
  • 为了验证指针加减运算时是移动一个字节还是移动指针所指向数据类型的字节长度。我们用一下程序即可验证。 1 int a = 0; 2 int* pa = &a; 3 4 printf("%d \n",(int)pa); 5 pa ++ ; 6 printf("%d \n",(int)pa); 7...
  • ●设置一前驱指针pre,用于指向待找到的第-个大于输人项指数的结点的前驱,pre初值指向头结点; ●指针q初始化,指向首元结点; ●循链向下逐个比较链表中当前结点与输人项指数,找到第一一个大于输人项指数的结点*q;将...
  • Complex Add(Complex C1,Complex C2)//复数加法 { Complex sum; sum.Realpart=C1.Realpart+C2.Realpart; sum.Imagepart=C1.Imagepart+C2.Imagepart; return sum; } Complex Sub(Complex C1,Complex C2)//复数...
  • 我之前的博客里有讲到cpu是怎么做加减乘除的 偶然间看到一个面试题说的是不用加法去做加运算 其实仔细想想,就是以二进制的方式来运算咯,只不过把计算机组成原理里的那套搬到编程里来 复习一下加法: cpu首先对加法...
  • C++:智能指针及其实现原理

    千次阅读 2018-05-25 10:44:58
    1. RAII思想 定义一个类来封装资源的分配与释放, 构造函数中完成资源的分配及初始化; 析构函数中完成资源的清理,可以保证资源的正确初始化和释放 如果对象是用声明的方式在栈上创建局部对象,那么RAII... 运算...
  • c++ 补码 位运算 指针

    2020-05-07 10:40:39
    C++位运算符 (&、|、~、^)[**C++位运算符] ...取反 ...^ 异或 参加运算的两个对象,对象位置不同(值不同),则该位为1。对应位置相同,则为0. p q p & q p | q p ^ q 0 0 0 0 ...
  • 指针与整数的加减指针的偏移)2.数组地址与整数的相加减(数组地址的偏移) 最终学习C/C++,遇到很多疑难杂症。希望用自己的理解和图形化的方式,把核心的问题表达清楚,即使是小白,也能看明白什么原理!(不忘初...
  • 必须注意,指针运算不同于常规的算术运算,一般地,40000+2的结果是40002,但当一个指针加上或减去一个整数时,指针并非简单地加上或减去该整数值,而是加上该整数与指针引用对象大小的乘积,而对象的大小则和机器与...
  • 指针

    2018-07-14 18:58:00
    指针变量可以表示各种数据结构,能很方便的使用数组、字符串和链表,并能像汇编语言一样处理内存地址,从而写出精炼而高效的程序。但是由于指针不并不是直接操作数据,而且它可以直接于内存打交道,使用稍有不慎,...
  • 计算机指令与运算基础原理笔记

    千次阅读 2019-10-02 16:59:48
    常见的指令可以分成五大类: (1)算术类指令,如加减乘除。(2)数据传输类指令,如给变量赋值、在内存里读写数据等。(3)逻辑类指令,如逻辑上的与或非。(4)条件分支类指令,如“if/else”。(5)无条件跳转...
  • 文章目录定点数的加减运算及实现补码加减运算及运算器补码加减运算方法补码加减运算的溢出判断补码加减运算器的实现机器数的移位运算逻辑移位算术移位循环移位移码加减运算与判溢十进制加法运算定点数的乘法运算及...
  • 汇编--算术运算指令:加减乘除

    千次阅读 2020-05-02 10:04:09
    普通加法ADD:两个字节运算 带进位的加法ADDC:多位运算,使用前要先将CF清零 加一指令INC:前两条会影响全部六个标志位,这一条不会影响CF(则其后面不能跟JNC类根据CY转移类指令) INC OPRD 其中操作数不能是立即数...
  • 我觉得写这个题一定要对原反补码的机制非常熟悉,其实加减乘除本身就是我们人自己的思维,在硬件底层笨猪CPU是没有这么复杂的想法的,首先CPU只有加法,移位和取反三个法则,而计算机底层都是用补码来进行运算的,为...
  • 编译原理计算器calculator+文法分析

    千次阅读 2019-10-23 10:09:39
    我们的编译原理作业 老师让写一个calculator,第一次写编译程序可能里面有不少冗余和低级处理,但是也push出来和大家共勉。 环境 我使用的是VS2019,用的c语言来做的。 目标 计算器接受四则运算表达式为输入(如下所...
  • 多字节减法程序前置基础知识加法运算指令普通加法指令ADD格式操作带进位位的加法指令ADC格式操作1指令INC格式操作减法运算指令不考虑借位的减法指令SUB格式操作考虑借位的减法指令SBB格式操作1指令DEC格式操作...
  • 研究了下编译原理的第一课, 对于现在的我,还是有点小烧脑的. 主要是我在括号递归用的指针位置上有些模糊.#include #include #include double analyze_1(char * str); void delspace(const char * str) { char * ...
  • 一、指针1、运用指针 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量。从指针指向的内存读取数据称作指针的取值。指针可以指向某些具体类型的变量地址,例如int、long和...
  • 4.1 加法运算类指令 4.2 减法运算类指令 4.3 乘除运算指令 4.4 逻辑运算指令 4.5 移位运算指令
  • 计算机系统中,数值一律用补码来表示:因为补码可以使符号位和数值位统一处理,同时可以使减法按照加法来处理。 对补码做简单介绍:数值编码分为原码,反码,补码,符号位均为0正1负。 原码 -> 补码: 数值位...
  • 计算机组成原理专题之浮点数运算

    千次阅读 多人点赞 2020-03-08 14:29:15
    计算机组成原理专题之浮点数运算 我们组原老师也甚是神奇。ppt一发,博客链接一发。大家自己看ppt,看ppt有困难的同学看博客链接。。。我一脸懵。。。 真的,例题我看不懂。。。不是假话。。然后我就一个概念一个...
  • 文章转自:无际单片机大家好,我是无际。今天给大家来讲解一下指针。我会由浅到深,最后结合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛!长文预警!全文大约5200多字,学指针看...
  • =1的情况,这里及存在一个精度的问题,但是不管你是将各数转为double 还是float类型都没有用,具体js里面的加法原理没有深究,但是我们可以使用如下方式做到精确加法,代码如下,供所有遇到同等问题的人参考。...
  • Java实现复数运算

    万次阅读 多人点赞 2019-07-21 21:44:59
     (2)复数之间的加法、减法、乘法和除法分别用不用的函数来实现。  (3)必须使用结构体指针的方法把函数的计算结果返回。  说明:用户输入:运算符号(+,-,*,/) a b c d.  输出:a+bi,输出时不管a,b是小于0或...
  • 微机原理实验2:多字节BCD加法实验

    千次阅读 2020-08-02 19:40:17
    要求数,被数均以ASCII码形式存放在以DATA1和DATA2为首的5个内存单元中( 低位在前),结果存在DATA1处。 三、程序清单 CRLF MACRO ;建立宏命令,利用INT中断实现回车换行的功能,方便后续直接调用 MOV DL,0DH ...
  • 本文是承接上一篇 Blog 而...文章目录二、算术运算指令2.1 加法指令2.2 减法指令2.3 乘法指令2.4 除法指令 二、算术运算指令 2.1 加法指令 【1】ADD 目标操作数, 源操作数 2.2 减法指令 2.3 乘法指令 2.4 除法指令 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,134
精华内容 8,453
关键字:

指针加减运算的原理