精华内容
下载资源
问答
  • 关于C++指针的加减法

    2021-02-12 14:14:24
    1、首先是正题,关于指针的加减法,所得结果与指针所指的类型有关。例如指针指向int,那么加减都以4个字节为单位,如果指向char,那么加减都以1个字节为单位,下面是测试代码及运行结果的截图。可见整型指针地址增加...

    CSAPP第三章看到3.8了,这一节在讲关于数据的表示,其中提到了指针的运算,本来自己只是想实践一下加深点印象,没想到小小的测试程序还又学到了一些新知识,觉得有必要记录一下:
    1、首先是正题,关于指针的加减法,所得结果与指针所指的类型有关。例如指针指向int,那么加减都以4个字节为单位,如果指向char,那么加减都以1个字节为单位,下面是测试代码及运行结果的截图。可见整型指针地址增加了4,字符型指针地址增加了1
    在这里插入图片描述
    2、打印字符指针的地址时,如果也直接使用cout << b会打印出a和空字符,因为C++重载了>>会直接打印出字符串的值而不是地址,想要打印出指针的地址需要使用static_cast<void*>从而避免重载
    3、这里使用delete时要注意,由于此时两个指针都已经没有指向内存了,所以需要将地址减一才能正确释放内存,否则会crash

    展开全文
  • 指针、数组和指针算数 指针和数组基本等价的原因在于指针算数c++内部处理数组的方式。指针变量加1,增加的量等于它指向的类型的字节数。将指向double的指针加1后,如果系统对double使用8字节存储,则数值增加8字节。...

    指针、数组和指针算数

    指针和数组基本等价的原因在于指针算数c++内部处理数组的方式。指针变量加1,增加的量等于它指向的类型的字节数。将指向double的指针加1后,如果系统对double使用8字节存储,则数值增加8字节。
    下面的例子展示了指针、数组和指针算数。指针和指针都可以通过指针和数组的方式获取数组的值。

    #include <iostream>
    
    int main()
    {
        using namespace std;
        double wages[] = { 10000,20000,30000 };
        short stacks[] = { 3,2,1 };
    
        double* pw = wages;
        short* ps = &stacks[0];
    
        cout << "pw = " << pw << ", *pw = " << *pw << endl;
        pw = pw + 1;
        cout << "pw + 1   " << endl;
        cout << "pw = " << pw << ", *pw = " << *pw << "\n\n";
    
        cout << "ps = " << ps << ", *ps = " << *ps << endl;
        ps = ps + 1;
        cout << "ps + 1   " << endl;
        cout << "ps = " << ps << ", *ps = " << *ps << "\n\n";
    
        cout << "access elements with array notation\n";
        cout << "stacks[0]= " << stacks[0] <<", stacks[1]= "<<stacks[1] << "\n\n";
    
        cout << "access elements with pointer notation\n";
        cout << "*stacks= " << *stacks << ", *(stacks+1)= " << *(stacks + 1) << "\n\n";
    
        cout << sizeof(stacks) << " size of stacks\n";
        cout << sizeof(ps) << " size of ps\n\n";
    
        ps--;
        cout << "ps[0]= " << ps[0] << ", ps[1]=" << ps[1] << ", ps[2]=" << ps[2] << "\n";
        cout << "*ps= " << *ps << ", *(ps+1)=" << *(ps+1) << ", *(ps+2)=" << *(ps+2) << "\n";
    
        return 0;
    
    }
    

    输出

    pw = 00DAFA28, *pw = 10000
    pw + 1
    pw = 00DAFA30, *pw = 20000
    
    ps = 00DAFA18, *ps = 3
    ps + 1
    ps = 00DAFA1A, *ps = 2
    
    access elements with array notation
    stacks[0]= 3, stacks[1]= 2
    
    access elements with pointer notation
    *stacks= 3, *(stacks+1)= 2
    
    6 size of stacks
    4 size of ps
    
    ps[0]= 3, ps[1]=2, ps[2]=1
    *ps= 3, *(ps+1)=2, *(ps+2)=1
    

    c++将数组名解释为地址。多数情况下c++将数组名解释为数组第一个元素的地址。 以下2种定义方式是等价的。

        double* pw = wages;
        short* ps = &stacks[0];
    

    从输出可知,*(stacks+1), stacks[1], *(ps+1), ps[1]是等价的。通常使用数组表示法时,C++都会执行以下转换:

    arrayname[i] becomes *(arrayname + 1)
    如果使用的是指针,而不是数组名,c++也会执行相同的操作:
    ptrname[i] becomes *(ptrname + 1)
    因此,在多数情况下,可以用相同的方式使用数组名和指针名。对于他们,可以使用数组方括号表示法,也可以使用指针解除引用运算符(*)。

    二者由2点不同:

    1. 可以修改指针的值,而数组名是常量
       ptrname = ptrname + 1;//valid
       arrayname = arrayname + 1;// not valid
      
    2. 对数组使用sizeof得到的是数组的长度,对指针使用得到的是指针的长度,即使指针指向的是一个数组。例如本例中对stacks数组和ps指针使用sizeof得到的结果:
    6 size of stacks
    4 size of ps
    
    数组的地址
    数组名被解释为数组第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址。二者略有不同。
    short tell[10];
    cout<<tell<<endl;
    cout<<&tell;
    

    二者虽然在数值上是相同的;但是从概念上说,&tell[0](即tell)是一个2字节内存块的地址,而&tell是一个20字节的内存块的地址。因此,表达式tell+1将地址值加2,而&tell+1将地址值加20.

    展开全文
  • 指针的加减操作,例如 p++,指的是(p指向的地址+该数据类型的字节数),例如: int a =0; int *p = &a; //取值符号 *p=1;//*解引用 句柄?? 函数传入函数 int (* funcP)(int a,int b) int fun1(int x, int ...

    指针的加减操作,例如 p++,指的是(p指向的地址+该数据类型的字节数),例如:
    在这里插入图片描述

    int a =0;
    int *p = &a; //取值符号
    *p=1;//*解引用

    句柄??
    函数传入函数
    int (* funcP)(int a,int b)
    int fun1(int x, int (* funcP)(int a,int b)){
    int res=(*funcP)(a,b);
    return 0;
    }

    int (* p) (int a ,int b)=fun(2,3);
    fun1(1,p)
    或者
    fun1(1,fun(2,3));
    然后这个指针就能调用函数了
    在这里插入图片描述

    用在网络请求上,如果失败调用一个函数,如果成功调用另一个函数。

    展开全文
  • c:结构体指针减法

    2021-09-30 11:02:19
    gcc 编译器会根据指针类型对绝对地址做右移操作,返回就是实际的元素个数。 [root@vmtca-2003 test]# cat struct.c #include <stdio.h> #include <string.h> typedef struct test { int a; int b; } ...

    gcc 编译器会根据指针类型对绝对地址做右移操作,返回就是实际的元素个数。

    [root@vmtca-2003 test]# cat struct.c
    #include <stdio.h>
    #include <string.h>
    
    typedef struct test
    {
            int a;
            int b;
    } TEST;sizeof 8int main()
    {
            TEST a[10];
            TEST * b= &(a[7]);
            printf("index=%d\n", b-&a[0]);   /// 这里是7
    return 0;
    }
    
    [root@vmtca-2003 test]# ./a.out
    index=7
    

    汇编

    0000000000400596 <main>:
      400596:       55                      push   %rbp
      400597:       48 89 e5                mov    %rsp,%rbp
      40059a:       48 83 ec 60             sub    $0x60,%rsp   分配0x60空间
      40059e:       48 8d 45 a0             lea    -0x60(%rbp),%rax  将这个地址放到rax 
      4005a2:       48 83 c0 38             add    $0x38,%rax        rax + 38,就是 b指向了 rbp+38 的位置。指向第7个元素
      4005a6:       48 89 45 f8             mov    %rax,-0x8(%rbp)4005aa:       48 8d 45 a0             lea    -0x60(%rbp),%rax
      4005ae:       48 8b 55 f8             mov    -0x8(%rbp),%rdx   指向第一个元素
      4005b2:       48 29 c2                sub    %rax,%rdx
      4005b5:       48 89 d0                mov    %rdx,%rax
      4005b8:       48 c1 f8 03             sar    $0x3,%rax  //算术右移 sizeof的大小 2的3次方 8;
      4005bc:       48 89 c6                mov    %rax,%rsi
      4005bf:       bf 78 06 40 00          mov    $0x400678,%edi
      4005c4:       b8 00 00 00 00          mov    $0x0,%eax
      4005c9:       e8 d2 fe ff ff          callq  4004a0 <printf@plt>
      4005ce:       b8 00 00 00 00          mov    $0x0,%eax
      4005d3:       c9                      leaveq
      4005d4:       c3                      retq
      4005d5:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
      4005dc:       00 00 00
      4005df:       90                      nop
    
    
    
    展开全文
  • 指针变量保存的是地址,而地址本质上是一个整数,所以指针变量可以进行部分运算,例如加法、减法、比较等,请看下面的代码: #include <stdio.h> int main(){ int a = 10, *pa = &a, *paa = &a; ...
  • 函数指针指针函数的定义和调用 确实第一次听到函数指针指针函数的时候感觉特别的绕。而且昨天要写函数指针的时候一下子想不起来,自己写篇文章和大家分享一下也让我增加印象。 指针函数 指针是函数的返回类型 ...
  • C语言 指针

    2021-05-23 03:54:16
    一、C语言 指针基础1、内存地址1、内存含义存储器:计算机的组成中,用来存储程序和数据,辅助CPU进行运算处理的重要部分。内存:内部存贮器,暂存程序/数据——掉电丢失 SRAM、DRAM、DDR、DDR2、DDR3。外存:外部...
  • c语言指针用法详解,通俗易懂超详细!

    千次阅读 多人点赞 2021-07-18 00:10:30
    文章转自:无际单片机大家好,我是无际。今天给大家来讲解一下指针。我会由浅到深,最后结合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛!长文预警!全文大约5200多字,学指针看...
  • 指针变量也称为地址数据类型,因为它们用于存储另一个变量的地址。地址是分配给变量的内存位置。它不存储任何值。因此,只允许对C语言中的指针执行一些操作。这些运算与我们通常用于数学计算的运算略有不同。操作是...
  • C语言 指针操作练习

    2021-05-21 09:05:09
    /*定义字符指针数组,用来保存字符串地址*/ char * p; /*初始化字符指针数组为全空*/ for( i=0 ; i; i++) { arr[i] = NULL ; } /* 将"-wl"的地址用arr[0]保存, 将"-jsj"的地址用arr[1]保存, 将"lst"的地址用arr[2]...
  • 如果考虑应用程序的兼容性和可移植性,指针的长度就是一个问题,在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,尽管C标准没有规定所有类型指针的长度相同,但是通常实际情况就是这样。...
  • C语言指针的长度和类型详解指针是C语言的精髓,以下是百分网小编搜索整理的关于C语言指针的长度和类型详解,对于初学者深入理解C语言程序设计有很好的参考价值,有需要的朋友可以参考一下!想了解更多相关信息请持续...
  • 众所周知 c语言学习过程当中 指针一直是个重点和难点 ,此帖谈一下我看完《c与指针》等书之后的见解;希望能帮到大家,内容有不对的欢迎大家指正 目录: 一: 内存中数据是如何存储的 二:指针是如何寻址的 三:...
  • C语言指针算术运算

    2021-05-19 08:58:19
    C语言中的指针可以进行以下算术运算:递增递减加法减法比较1.递增指针在数组中使用递增指针是因为它是连续的内存位置。此外,经过计算我们可以知道下一个位置的值。递增操作取决于指针变量的数据类型。递增指针的...
  • 指针定义:int * p; p = &a[0]; // p 指向数组首元素指针定义:int * p; p = a; // p 仍指向数组首元素指针定义:int * q; q = &a[2]; // q 指向 a[2]希望表达 p、q 之间的联系它们都指...
  • 指针输出二维数组#includeintmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int*p;for(p=a[0];p<12+a[0];p++){if((p-a[0])%4==0)printf("\n");printf("%4d",*p);}printf("\n");return0;}以上程序的运行...
  • 指针 概念 指针是什么? 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。...
  • 指针算术运算分为指针加法运算和指针减法运算。一、指针加法运算这里对指针加常数(如int*p,p++)进行讨论指针加指针 非法假设指针+1有以下三种情况:1、加一个单元格 (正确)2、加一个字节3、加整个数组(没有意义)#...
  • C语言指针详解

    2021-05-21 01:26:25
    前言这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及...
  • char arr[3];printf("arr:\n%d\n%d\n%d\n", arr, arr + 1, arr + 2);char *parr[3];...从结果可以看到,字符数组每个元素占1字节,字符指针数组每个占4字节。再看一个例子:char a = 'a', b = 'b', c ...
  • 指针:用于存储数据或函数的内存地址的变量,指针也占用内存空间 内存地址也是数字或值 2.1 变量的地址 上图表示如何用整型变量x存储值40。将值40存储在0x00394768位置,这个位置被变量x引用。 内存地址也是数字或...
  • 指针指针之间的减法运算 指针指针之间可以做减法运算,结果是一个long类型的数据, 结果的意义代表两个指针指向的变量之间相差多少个单位变量,绝大多数情况下,我们用在判断数组的两个元素之间相差多少个元素 ...
  • 如果两个指针向同一个数组,它们就可以相减,其为结果为两个指针之间的元素数目。仍以本章开头介绍的街道地址的比喻为例,假设我住在第五大街118号,我的...指针之间的减法运算和上述方法是相同的。在折半查找的过...
  • 例子1:#include int main(){float arr[5] = {12.5, 10.0, 13.5, 90.5, 0.5};float *ptr1 = &arr[0]; //ptr1 is 925601136float *ptr2 = ptr1 + 3;// ptr2 is 925601148printf("%f ", *ptr2);...
  • Excel减法函数公式

    2021-07-20 03:11:04
    根据网友提出的“错位减法的Excel减法公式”等问题,Excel办公网整理了一些著名网站上关于“错位减法的Excel减法公式”的信息标题: 求等比数列前n项之和的方法(数学)公式法和位错减法最好有一个例子参考文献: 常用...
  • 详解C语言指针

    2021-05-21 08:52:37
    内存和地址1.内存中每个位置都是一个独一无二的地址...所有这些变量为我们提供一种更方便的方法记住地址——硬件扔然是通过地址访问变量指针变量的内容变量的值就是分配给这个变量的内存位置所存储的值,一个变量...
  • 函数指针1)函数指针的例题2. 指针函数3. 函数指针数组1)函数指针数组的用途4. 指向函数指针数组的指针5. 一些后话 1. 函数指针 函数指针就是指向函数的指针;本质上还是一个指针 首先我们要知道函数的地址就是函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,668
精华内容 10,667
关键字:

指针减法