精华内容
下载资源
问答
  • C语言之数组下标引用与间接引用

    千次阅读 2018-04-13 21:47:24
    数组元素的访问方式有下标引用间接访问两种. 除了优先级之外, 下标引用间接访问完全相同. arrayname[subscript] = *(arrayname + (subscript)) 例如: int arrayname[10]; int *arrayptr = arrayname + 2; ...

    数组元素的访问方式有下标引用和间接访问两种.
    除了优先级之外, 下标引用和间接访问完全相同. arrayname[subscript] = *(arrayname + (subscript))
    例如:

    int arrayname[10];
    int *arrayptr = arrayname + 2;
    • arrayptr = arrayname+2 = &arrayname[2]
    • *arrayptr = arrayname[2] = *(arrayname+2)
    • arrayptr[0] = *(arrayptr+(0)) = arrayname[2] = *(arrayname+2)
    • arrayptr+6 = arrayname+8 = &arrayname[8]
    • *arrayptr+6 = *(arrayname+8)+6 = arrayname[2]+6
    • *(arrayptr+6) = *(arrayname+8) = arrayname[8]
    • arrayptr[6] = *(arrayptr+(6)) = *(arrayname+8) = arrayname[8]
    • arrayptr[-1] = *(arrayptr+(-1)) = *(arrayname+1) = arrayname[1]
    • 2[arrayname] = *(2+(arrayname)) = *(arrayname+2) = arrayname[2]

    如果可以互换的使用下标引用和间接(指针)引用, 那么应该选择哪一个呢?
    通常考虑以下方面:
    1. 下标访问更容易理解, 可读性更高.
    2. 下标引用不会比指针引用更有效率, 但是有时指针会比下标更有效率.

    考虑下面的循环:

    // 使用下标
    int arrayname[10], index;
    for(index = 0; index < 10; index++)
        arrayname[index]= 0;

    在每次循环中, 程序获取index的值并于 sizeof(int) 相乘(因为数组指针的移动的间隔是sizeof(int)个内存单元). 这个乘法需要花费一定的时间和空间.

    // 使用指针
    int arrayname[10], *arrayptr;
    for(arrayptr = arrayname; arrayptr < arrayname + 10; arrayptr++)
        *arrayptr = 0;

    上述代码中仍然存在乘法运算, 即 arrayptr++ 中, 1 * sizeof(int) 后与arrayptr相加. 但是注意到每次乘法都是 1 * sizeof(int) 所以编译器在编译时执行一次乘法后程序运行时就不再需要执行乘法, 程序中包含了数组指针与 1 * sizeof(int) 结果相加的指令.

    展开全文
  • //间接引用 //取出地址中的值,*号表示在单目运算中表示取值运算符,在双目运算符中表示乘 //例如a * b //注意单目运算时结合方向由右向左的 printf ("%d\n", * &a); //结果等于 printf ("%d\n",a); //根据...

    #include <stdio.h>
    int main()
    {
    int a=10;
    int b;
    b=a;
    //取地址
    //地址符+变量名
    &a;
    printf("%p\n",&a);
    //地址的范围0x000000000001-0xffffffffffff 由12个16进制的数组成
    //地址由四个字节组成显示的是首字节的地址
    //每次打印地址都是变化的,是因为地址用过之后被回收了,下次使用会再次分配。
    //内存地址是由系统分配的,内存大地址长度大,内存小地址长度小。
    //printf("%p\n",a);把a的以十六进制输出,当然也可以10进制,数值未变。
    //printf("%p\n",&a);把地址以十六进制输出,当然也可以10进制,数值未变。
    //地址不额外占用内存空间。举例4g内存,地址不在这个4g内存之中。
    //***********//
    //间接引用
    //取出地址中的值,*号表示在单目运算中表示取值运算符,在双目运算符中表示乘
    //例如a * b
    //注意单目运算时结合方向由右向左的
    printf ("%d\n", * &a);
    //结果等于
    printf ("%d\n",a);
    //根据输出结果可以看出 * &a=a,为什么要通过&得到a的地址,之后再通过 * 取a的值打印出来呢,
    //是因为我们正常不知道a这个变量,所以无法对其操作,需要根据使用malloc函数根
    //据我们变量的类型和数据的大小动态申请空间,我们将得到这块空间的首地址
    //然后通过这个地址,间接对这段空间赋值
    return 0;

    }

    展开全文
  • C语言中,对变量的使用实质上是对计算机内存中存储内容的访问,通过对内存空间的引用来实现写入和读取。(注:C中有一个特殊的关键字register, 用来声明非存储在内存当中的变量,register用来要求将变量存储在...

          在C语言中,对变量的使用实质上是对计算机内存中存储内容的访问,通过对内存空间的引用来实现写入和读取。(注:C中有一个特殊的关键字register,

    用来声明非存储在内存当中的变量,register用来要求将变量存储在计算机的寄存器当中,这样的变量主要的目的是加快CPU访问的速率)REGISTER关键字是

    特定时期的产物,在内存访问速度很慢的时代用register定义的变量,确实存储在计算机CPU的寄存器当中,现在来说由于内存的访问速率也很快,很多编译器在

    编译的时候,会将register变量也存储在内存当中。这里主要讨论简介引用和解析引用,因此对register就不再讨论。

          间接引用是指在汇编语言指令中不直接指出内存的地址,而是通过一个寄存器或者一个内存空间来访问另外一个内存空间。

    Exp:

          mov    ax,[bx]

    这样就实现了一个间接引用,这条语句并不是直接的访问bx寄存器,而是访问bx指向的内存空间。在C中我们通过指针来实现间接引用。

    Exp:

            int     var1;

            int      *pvar=NULL;

            pvar=&var1;

            *pvar=10;

    这样就实现了一个间接引用,通过一个内存空间来访问另一个内存空间,于是就实现了间接引用。在计算机的世界里面间接引用也叫做间接寻址。

    上面的C语言实现翻译成汇编指令可能为下面的形式:

           mov    [ax], 10       ;ax中存储的内容就是变量var1的内存地址,实际上还可能涉及到物理地址的偏移量计算

    汇编语言与C语言的最大区别就是可以显式的访问寄存器和直接计算得到某个内存地址,其他的像循环语句等其他C语言控制结构在汇编中一样可以实现,

    在汇编语言中可以显式的指定程序执行的开始地址,可以通过ORG指令来实现,具体就不讨论了。

    1、间接引用

         我们可以通过几个实例来看看间接引用:

         int  var1;

         int  var2;

         int  *pvar1=NULL;

         int   **pvar=NULL;

          pvar1=&var1;  //间接引用的必须条件,通过 & 运算符来实现将一个内存空间的地址放到另外一个内存空间中。

          pvar=&pvar1;  //间接引用, 因为pvar1也是一个变量,指针变量,因此在C中也有一个与之对应的内存空间,

          *pvar1=10; //这里的意思就是将整型字面值放到*pvar1指向的内存空间,

          pvar=&var2, // 这里是不对的,虽然我们也可以通过一定的方式使之可以顺利的运行,但是如果那样做的话,可能会引入未知的错误。

    如果实在想通过pvar来间接引用var2的话,怎么办呢? 那就和下面一样:

          *pvar=&var2;

    然后像下面这样来引用var2;

          *(*pvar)=10;   //var2=10

    2、解析引用

        我也不知道这么说是否恰当,但是 * 运算在对地址进行运算的时候,很多权威的文档都这么说,我也就跟着说了,其实*的解释没有什么

    特别的,那就是:

         *  取出的是存储在一个内存空间区域(内存区域1)的内容,并且将取出的内容解释为另外一块内存区域(内存区域2)。然后我们就可以对

    内存区域2进行访问。

         如果进行多重的解析运算,那么就会涉及到更多的内存区域, 就像前面所说的:

    Exp:

         int  var1;    //var1 内存空间1,这里可以简单理解为 var1这个标示符指向内存空间1,虽然我们并没显式的指出这个指向

         int  var2;    //var2 内存空间 2

         int  *pvar1=NULL; //pvar1 内存空间3

         int   **pvar=NULL;// pvar  内存空间4

         pvar1=&var1;    // 将内存空间1的位置放置到内存空间3里面,形成了一个指向关系 

         pvar1=10;      //将整型字面值10,放置到内存空间3指向的内存空间 1 里面。

         *pvar=&pvar1, // 形成一个多重指向,pvar 指向 pvar1, 而**pvar将指向  内存空间1 

    3、 关于定义指针变量解析运算符的位置

    Exp:

          int  *p;

        int*   p;

    上面的两种定义的方式在本质上没有区别, 但是如果涉及到更多的变量定义的话就可能引起误解。

    我的习惯是每个变量定义单独占用一行:

    Exp:

          int   *p1,

                 *p2;

    这样就很清楚了。

    如果涉及到typedef的话,那么就会另外的情形了,

    Exp:

         typedef   int     *INT;

         INT   var1;

         INT   *var2;

    很不幸的是很多人在这个地方会犯错, 我也曾经犯过错,原本想声明一个指向int变量的指针var2,结果是定义了一个指向int *类型的指针

    变量。

    现在我的习惯是: 

        1、在非typedef定义时*运算符靠近变量

        2、在typedef定义新的的类型标示符时*靠近原来的类型标识符。

    Exp:

        int   *p,   *pp;

        typedef    int*   PINT;

    这样意图就很明显了,并且不容易引起误解。

    4、指针的四则运算

       两个指针变量相加是未定义的行为, 

       两个指针变量想减的结果返回两个内存空间的距离,

       两个指针变量相称是未定义的行为,

       两个指针变量相除是未定义的行为,

       指针变量和整型值相加减是指针移动其指向的位置。

       指针变量和整型值相乘除是未定义的行为。

    Exp:

        size_t   (strlen)(const char *str)

        {

             char *start;

             start=str;

             while(*start)

              {

                     start++;

               }

              return  (start-str);

         }

    5、 理解指针

         理解指针最主要的是要有指向的概念,如果单纯的从变量存储的角度来理解,可能会遇到很多疑问。

       

         指向这个词还真有点特殊,关键是要明白间接引用。

            

    转载于:https://www.cnblogs.com/volcanol/archive/2011/09/24/2189690.html

    展开全文
  • C语言指针和Java引用

    2021-03-11 17:32:58
    举个例子: C语言中int a[4];...a是存放在栈存储区的,而实际要访问的内容是存放在堆存储区中的,a中存放的就是堆存储区中某一段的地址,要想访问堆存储区中的内容,还要通过栈中的引用间接访问堆存储器 ...

    举个例子:
    C语言中int a[4];
    a是直接指向内存的指针,通过a可直接访问内存

    Java中int []a = new int[4];
    a是存放在栈存储区的,而实际要访问的内容是存放在堆存储区中的,a中存放的就是堆存储区中某一段的地址,要想访问堆存储区中的内容,还要通过栈中的引用间接访问堆存储器

    展开全文
  • C语言指针解引用注意事项

    千次阅读 2018-05-14 11:03:47
    在指针的操作中,间接运算符*,也被称为解引用运算符。注意事项最重要的一点是:不要解引用未初始化的指针如:int * pt;//未初始化的指针*pt=5;//这句话是错的为什么是错的,因为第2行的意思是把5储存在pt指向的...
  • C语言

    2018-11-14 23:08:02
    C 语言只有值的传递,无法直接传递引用,要想传递引用必须通过指针间接实现。 如果 C 语言没有指针,一切都通过值传递,参数将永远只有输入参数,所有的结构体只要参与运算都具有极高的开销,因为每传递进函数参数...
  • 引用就是给一个变量领取一个变量名,方便我们间接地使用这个变量。我们可以给一个变量创建N个引用,这N + 1个变量共享了同一块内存区域。 1. 声明引用 创建引用的格式如下: 数据类型 引用名 = 原变量 比如: int ...
  • 指针变量:需要【分配内存区域】,是间接访问变量,需要自己的内存空间  其指向①可变的(除非用了const)②不一定存在,比如空指针NULL   引用:【不用分配内存区域—引用(别名而已)的地址其实就是被引用对象的...
  • 文章目录指针和动态内存分配引用&将引用用于结构何时使用引用参数?指针指针和const通过指针返回字符串的函数通过指针返回结构函数指针声明函数指针函数...*:去引用 (间接引用)操作 引用& 首先,&不是.
  • C语言结构体

    2018-12-17 11:22:00
    C语言聚合数据类型包括数组和结构体,其中数组中是相同类型的元素的集合,可以通过下标引用或之子很间接访问,但结构体各个成员可以是不同的数据类型。 结构声明 完整的结构声明:struct tag {number-list} ...
  • ->:间接引用运算符

    2018-06-26 23:18:00
    换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”.举个例子:struct Data{ int a,b,c;}; /*定义结构体*/struct Data * p;/*...
  • C语言---指针与引用的区别

    千次阅读 2015-04-26 21:33:49
     虽然使用引用 (reference)和指针都可间接访问另一个值,但它们之间有两个重要区别。第一个区别在于引用总是指向某个对象:定义引用时没有初始化是错误的。第二个重要区别则是赋值行为的差异:给引用赋值修改的是...
  • 普通变量直接引用其中的值,指针变量则间接引用所指向内存地址中的值。指针变量在使用前需要声明与初始化。   4.5.1 指针变量的定义 指针变量定义时,需要指定所指向的数据类型。声明指针变量的一般形式为: ...
  • C语言指针讲解

    2021-01-03 17:17:25
    指针间接引用 这是直接引用: #include <stdio.h> int main() { int a=100; printf("a=%d",a); } 这是利用指针的间接引用: #include <stdio.h> int main() { int a=100; int *pointer_1=&...
  • C语言指针

    2018-04-20 16:00:17
    *为间接寻址或间接引用运算符,作用于指针时,返回指针指向的对象int * p,atoi(char *),z[10];int a;p为指针,atoi函数的返回类型为指针p = &amp;a;&amp; 为取地址符号,&amp; 和*具有最高优先级...
  • C语言笔记

    2020-11-02 11:29:07
    3.间接访问符(解引用): int *p=&a; *p=99//解引用 &&: 并且; 逻辑与; (表达式1&&表达式2) 短路与: 只要表达式1为假,则不执行表达式2 ||: 或; 逻辑或; (表达式1||表达式2) 短路或:若表达式1为真,...
  • C语言知识

    2019-02-16 23:34:35
    1)引用是变量的别名,实际上就是直接在操作该变量,而指针是通过指针变量指向一个对象,间接操作该对象, 2)引用必须进行初始化,而指针可以不初始化。 3)不存在指向空的引用,但是存在指向空的指针 ...
  • C语言特殊符号

    2018-10-30 14:36:00
    C语言中称为间接引用运算符,是二目运算符,优先级同成员运算符“.”。用法:p->a,其中p是指向一个结构体的指针,a是这个结构体类型的一个成员。表达式p->a引用了指针p指向的结构体的成员a。例如:struct T...
  • c语言数组

    2018-04-07 20:07:28
    1.数组名的值是指针常量(不可被修改),...2.除了优先级以外,下标引用间接访问完全相同(间接访问效率>=下标引用) 3.数组和指针的区别:声明一个数组的时候,编译器会为数组保留元素数量的内存空间,数组名是常量. ...
  • c语言指针

    2019-10-25 15:03:47
    指针: &a:获取a的地址,&取地址符 &变量名:获取该变量的地址,和变量的类型...*p:访问p所指向的变量,*间接访问符,解引用 &a &b为整型地址值 int main() { int a = 10; int b = 20; int *p =...
  • C语言__指针

    2018-05-27 08:43:14
    方式首先将变量a的地址存放在另一个变量中,比如存放在变量b中,然后通过变量b来间接引用变量a,间接读写变量a的值。这就是"间接引用"。指针的定义一般形式:类名标识符 *指针变量名; int *p; float *q; ...
  • c语言中的指针

    2015-07-08 00:44:12
    直接引用和间接引用在说啥是指针之前,先把这2个概念搞清楚。直接引用就是对一个变量自身的赋值和取值,自给自足,不麻烦别人。int a; a = 12; //直接引用赋值printf("%d", a) //直接引用取值如图所示: 间接引用呢...
  • C语言之结构体

    2019-10-06 02:32:09
    数组是相同元素的集合,它的每个元素是通过下标引用或指针间接访问来选择的。结构也是一些值得集合,这些值称为成员,但每一个结构的成员可能具有不同的类型。 二、结构体相关知识 1.结构声明   在结构声明时,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 420
精华内容 168
关键字:

c语言间接引用

c语言 订阅