精华内容
下载资源
问答
  • C语言中指针的用法C语言中指针的用法 intmain(void) {inta =10; } 指针存放地址,那么计算机是如何存放上面定义的a呢? 首先,a占4个字节,因为其是int类型,然后,int类型10的..
  • C语言中指针C语言中指针C语言中指针
  • C语言中指针的使用

    2014-06-02 19:23:35
    C语言指针的使用 C语言指针的详细介绍与使用总结
  • 主要介绍了C语言中指针函数与函数指针的区别,指针函数和函数指针C语言入门学习的基础知识,需要的朋友可以参考下
  • C语言中指针的灵活运用C语言中指针的灵活运用C语言中指针的灵活运用C语言中指针的灵活运用C语言中指针的灵活运用
  • 主要介绍了C语言中指针数组与数组指针的区别,是C语言入门学习的基础知识,需要的朋友可以参考下
  • C语言中指针学习 C语言中指针学习 C语言中指针学习
  • C语言指针理解C语言指针理解C语言指针理解
  • c语言中指针的知识点

    2018-06-25 22:58:49
    c语言指针的基础知识点都这里,可以帮助你更好的了解指针。
  • C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言...
  • C语言指向指针指针

    2020-07-15 03:39:00
    本文主要讲了C语言指向指针指针的相关问题,下面一起来学习一下
  • 主要给大家介绍了关于C语言中指针的加减运算的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • C语言中指针的奥秘C语言程序设计教程系统.pdf
  • 本书是一本经典C语言数据,适合初中级 读者, 特别是对C指针有深刻的描述
  • c语言中 指针加法

    千次阅读 2018-11-02 11:55:01
    c语言中 指针加法(p++,p+2) 例如:int arr[10]={1,2,3} int *p=arr; p++; *p=10; 例题的p++的意义: 有如下的三种可能性:1、加一个字节; 2、加一个单元格; 3、加一个数组; 我们做以下的...

    c语言中 指针加法(p++p+2)

    例如:int arr[10]={1,2,3}

          int *p=arr;

          p++;

          *p=10;

    在例题中的p++的意义:

    有如下的三种可能性:1、加一个字节;

                        2、加一个单元格;

                        3、加一个数组;

     

    我们做以下的分析 :             

    对于第一种可能性:

      加一个字节的话,即在101105中间放入解引用的10;(如图所示)

     将红色部分放大4倍:

    注:小端:低地址放小数据

    大端:底地址放大数据

    pc端为小端:则1存放的方式为,00000001

     进行*p=10的步骤:

               

    对于第二种可能性:

               

    对于第三种可能性:

    即加入一个数组,这种可能性不存在。

     

    由上可知,p+1为加人一个单元格;

     

    做如下的练习:

    指针+-数字

    #include <stdio.h>

    int main()

    { int *p=(int *)1000;

      printf("%d\n",p+4);    1016

      printf("%d\n",(short *)p+4);     1008

      printf("%d\n",(long *)p+4);      1016

      printf("%d\n",(double *)p+4);    1032

      printf("%d\n",(char *)p+4);      1016

       printf("%d\n",(char **)p+4);     1004

       printf("%d\n",(long long)p+4);   1004

    }

     

    #include <stdio.h>

    int main()

    {

       int *p=(int *)0x2010;

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

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

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

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

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

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

        return 0;

    }

     

     

     

     

     

    展开全文
  • C语言中指针传递问题

    千次阅读 2018-08-08 20:23:25
    C语言中指针传递问题 要求:用C语言通过调用函数实现两个值的交换 例如:输入5,9 —– 输出9,5 不能到达预期的结果的代码 #include&amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;gt; void main...

    要求:通过调用函数实现两个值的交换

    例如:输入5,9 —– 输出9,5


    不能到达预期的结果的代码

    #include<stdio.h>
    
    void main()
    {
        void swap(int *p1, int *p2);
        int a,b;
        int *pointer_1,*pointer_2;
        scanf("%d,%d",&a,&b);
        pointer_1 = &a;
        pointer_2 = &b;
        printf("指针pointer_1、pointer_2初始化的地址(自身)   %d     %d\n", &pointer_1, &pointer_2); //1703732  1703728
        printf("指针pointer_1、pointer_2存储的值   %d     %d\n", pointer_1, pointer_2); //1703740  1703736
    
        printf("\n");
        printf("a,b交换之前的地址   %d       %d\n", &a, &b);  //1703740  1703736
        printf("a,b交换之前的值   %d       %d\n", a, b);  //5  9
    
        if(a < b)
        {
            swap(pointer_1,pointer_2);
        }
        printf("指针pointer_1、pointer_2初始化的地址(自身)   %d     %d\n", &pointer_1, &pointer_2); //1703732  1703728
        printf("指针pointer_1、pointer_2存储的值   %d     %d\n", pointer_1, pointer_2); //1703740  1703736
    
        printf("\n");
        printf("a,b交换之后的地址   %d       %d\n", &a, &b);  //1703740  1703736
        printf("a,b交换之后的值   %d       %d\n", a, b);  //5  9
    
    }
    
    void swap(int *p1,int *p2)
    {
        printf("\n******************调用函数开始****************");
        printf("\n");
        printf("before_self     %d      %d\n",&p1,&p2); //1703644  1703648
        printf("before_storage_address     %d      %d\n",p1,p2);  //1703740  1703736
        printf("before_result     %d      %d\n",*p1,*p2);  //5  9
    
        int *p;
        p = p1;
        p1 = p2;
        p2 = p;
    
        printf("\n");
        printf("after_self     %d      %d\n",&p1,&p2);  //1703644  1703648
        printf("before_storage_address     %d      %d\n",p1,p2);  //1703736  1703740
        printf("after_result     %d      %d\n",*p1,*p2);  //9  5
    
        printf("******************调用函数结束****************\n\n");
    }
    

    输出结果

    这里写图片描述

    原因

    在给a和b分别赋值5,9后,把a的地址1703740给了指针变量pointer_1,把b1703736的地址给了指针变量pointer_2(为了方便,地址用%d输出,不同的PC,情况不同,但是原理都一样)。然后调用函数,把指针存储的值(a、b的地址)传递给P1、P2指针。

    swap(pointer_1,pointer_2);
    void swap(int *p1, int *p2);

    在调用函数的进行交换的代码,可以看出,只是单纯的将各自存储的地址进行交换而已。

    int *p;
    p = p1;
    p1 = p2;
    p2 = p;

    所以,指针变量只是在调用函数里交换了存储的地址,可以在调用函数里输出9,5。但是一旦调用结束,P1、P2指针变量就会被释放。并没有在根本上进行交换。

    这里写图片描述


    能到达预期的结果的代码

    只需要将调用函数修改如下:

    void swap(int *p1,int *p2)
    {
        printf("\n******************调用函数开始****************");
        printf("\n");
        printf("before_self     %d      %d\n",&p1,&p2); //1703644  1703648
        printf("before_storage_address     %d      %d\n",p1,p2);  //1703740  1703736
        printf("before_result     %d      %d\n",*p1,*p2);  //5  9
    
        int p;
        p = *p1;
        *p1 = *p2;
        *p2 = p;
    
        printf("\n");
        printf("after_self     %d      %d\n",&p1,&p2);  //1703644  1703648
        printf("before_storage_address     %d      %d\n",p1,p2);  //1703740  1703736
        printf("after_result     %d      %d\n",*p1,*p2);  //9  5
    
        printf("******************调用函数结束****************\n\n");
    }

    输出结果

    这里写图片描述

    原因

    修改后的调用函数的指针变量,交换的不再是地址,而是通过地址找到a、b的值,将a、b的值进行交换

    int p;
    p = *p1;
    *p1 = *p2;
    *p2 = p;

    这里写图片描述

    展开全文
  • C语言对于指针的最详细权威解析,能够完全理解c语言中最难理解的指针
  • C语言指针学习C语言指针学习C语言指针学习C语言指针学习
  • C语言——指针

    2021-01-07 11:06:45
    而为了保存一个数据内存的地址,我们就需要指针变量。 众所周知,C语言的基本数据类型有:char、Int、float、double。所占字节分别为1个字节、4个字节、4个字节、8个字节。同样指针 这个概念也泛指 一类数据类型...
  • c语言中指针的用法

    千次阅读 2018-11-12 14:50:18
    1.什么是指针: 指针就是地址。 2.指针变量的定义: 首先要区分指针指针变量:指针是地址,...指针变量名为 i,而不是 *i,i的值为一个地址,*i的值是存放地址i的内容。 3.指针变量的初始化: (1)int i = 3, *j...

    1.什么是指针:
    指针就是地址。
    2.指针变量的定义:
    首先要区分指针与指针变量:指针是地址,而指针变量是用来存放这个地址的变量。
    指针变量定义的一般形式:基本数据类型 + ’ * ’ + 变量名。
    例如:int *i;
    ‘ * ’表示该变量的类型为指针类型。指针变量名为 i,而不是 *i,i的值为一个地址,*i的值是存放在地址i中的内容。
    3.指针变量的初始化:
    (1)int i = 3, *j; j = &i;
    (2)int i = 3; int *j = &i; //*j表示定义了一个指针变量j, 并将变量i的地址赋给它
    这个程序与第一个程序有什么不同?同样是将变量 i 的地址赋给指针变量 j,第一个程序是“j=&i;”,而第二个程序是“*j=&i;”。原因是,前者是定义指针变量后对它初始化,即先定义后初始化;而后者是定义指针变量时对它进行初始化,即定义时初始化。通过这个对比我们可以更鲜明地看出定义指针变量时的“*j”和程序中用到的“j”含义的不同。
    常见未初始化的错误:
    (1)# include <stdio.h> int main(void) { int i = 3, *j; *j = i; return 0; }
    程序中,j 是 int
    型的指针变量。j 中存放的应该是内存空间的地址,然后“变量 i 赋给 *j”表示将变量i中的值放到该地址所指向的内存空间中。但是现在 j 中并没有存放一个地址,程序中并没有给它初始化,那么它指向的就是 0XCCCCCCCC 这个内存单元。这个内存单元是不允许访问的,即不允许往里面写数据。而把 i 赋给 *j 就是试图往这个内存空间中写数据,程序执行时就会出错。但这种错误在编译的时候并不会报错,只有在执行的时候才会出错,即传说中的“段错误”。所以,一定要确保指针变量在引用之前已经被初始化为指向有效的地址。
    (2)# include <stdio.h> int main(void) { int *i; scanf("%d", i); return 0; }
    该程序试图给指针变量 i 所指向的内存单元赋值。但现在指针变量 i 并没有初始化,所以程序执行时出错。所以同样,在使用 scanf 时必须要先给指针变量 i 初始化。
    (3)# include <stdio.h> int main(void) { int i = 3; int *j = NULL; *j = i; return 0; }
    之前是没有给指针变量j初始化,现在初始化了,但是将它初始化为指向 NULL。NULL 也是一个指针变量。NULL 指向的是内存中地址为 0 的内存空间。以 32 位操作系统为例,内存单元地址的范围为 0x00000000~0xffff ffff。其中 0x00000000 就是 NULL 所指向的内存单元的地址。但是在操作系统中,该内存单元是不可用的。凡是试图往该内存单元中写入数据的操作都会被视为非法操作,从而导致程序错误。同样,这种错误在编译的时候也不会报错,只有在执行的时候才会出错。这种错误也属于“段错误”。
    然而虽然这么写是错误的,但是将一个指针变量初始化为指向 NULL,这在实际编程中是经常使用的。就跟前面讲普通变量在定义时给它初始化为 0 一样,指针变量如果在定义时不知道指向哪里就将其初始化为指向 NULL。只是此时要注意的是,在该指针变量指向有效地址之前不要往该地址中写入数据。也就是说,该指针变量还要二次赋值。
    既然不能往里面写数据,而且还容易犯错,为什么还要这样给它初始化呢?直接同前面定义普通变量时一样,在定义时也不初始化,等到后面知道该给它赋什么值时再给它赋值不行吗?可以!但还是建议大家将它初始化为 NULL,就同前面将普通变量在定义时初始化为 0 一样。这是很好的一种编程习惯。
    最后关于 NULL 再补充一点,NULL 是定义在 stdio.h 头文件中的符号常量,它表示的值是 0。
    4.指针与数组
    (1)指针引用数组

    int main(void)
    {
        int a[] = {1, 2, 3, 4, 5};
        int *p = &a[0];
        int *q = a;
        printf("*p = %d, *q = %d\n", *p, *q);
        return 0;
    }
    

    上述程序中p与 q的值是相同的,这就表明p = &a[0]与q = a是等价的。
    (2)不同指针类型的大小

    int main(void)
    {
        int    *a = NULL;
        float  *b = NULL;
        double *c = NULL;
        char   *d = NULL;
        printf("%d %d %d %d\n", sizeof(a), sizeof(b), sizeof(c), sizeof(d));
        return 0;
    }
    运行结果:4,4,4,4
    

    可见,不管是什么基类型,系统给指针变量分配的内存空间都是 4 字节。在 C 语言中,只要是指针变量,在内存中所占的字节数都是 4。指针变量的“基类型”仅用来指定该指针变量可以指向的变量类型,并没有其他意思。不管基类型是什么类型的指针变量,它仍然是指针变量,所以仍然占 4 字节。

    展开全文
  • 单片机C语言中指针的应用。 本丈主要结合51单片机系统的硬件资源特点, 从指针结构声明,对于不同存储区(片内、片外毅据存储区和 程序存储区)的指针寻址的实现等方面阐述了单片机C语言 才匀针的应用。
  • 聊聊C语言指针的本质

    万次阅读 多人点赞 2019-11-24 21:07:34
    很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针...

    坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。


    很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。

    那么,什么是指针,为什么大家都想避开指针。

    很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。

    指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起。

    宏观看来,计算机可以分为两类:

    1. 存储-执行计算机。
      这类机器典型的例子就是我们平时使用的计算机,有一个CPU,有一个内存,CPU仅包含运算逻辑,所有的指令和数据都在内存中,内存仅供存储,不包含任何运算组件。
    2. 现场编程计算机。
      这类机器的典型例子就是ASCI电路,FPGA这种。直接针对特定的需求构建逻辑电路,然而,由于存在笛卡尔积的问题,不太适合通用计算。

    我们看我们平时使用的存储-执行模型的计算机工作模式:

    • CPU在地址总线上发射一个地址到内存。
    • 内存把特定地址对应的数据返回到数据总线。

    看起来,通用计算机就是通过指针完成所有工作的。CPU没有能力直接操作内存里的值,它必须做以下的操作以迂回:

    1. 从特定地址A0取出值V0。
    2. 对V0进行加工运算生成V1。
    3. 将V1存入特定地址A1。

    太初,人们就是按照以上的这么个逻辑编程的,这就是汇编语言:

    mov    -0x4c(%rbp),%ebx
    

    然而,这样太麻烦了,C语言随着简单通用的UNIX操作系统而生,下面的语句看起来更加方便:

    int a = 10;
    char *p = &a;
    *p = 13;
    

    C语言直接映射了CPU的工作方式,而且是用极其简单的方式,这就是C语言的艺术。

    这就是C指针的背景。在那个年代,人们还没有渴望计算机帮助完成更复杂的业务逻辑,人们只是希望用一种更加简单的方式抽象出计算机的行为,最终的结晶,就是C语言。

    于是,我们说,C语言的精华就是指针,指针是C语言的一切。我们可以没有if-else语言,我们可以没有switch-case语句,我们可以不要while,我们不要for,但我们必须有指针。

    是的,我们可以用指针函数的状态矩阵代替if-else之类:

    int (*routine)[...]();
    ...
    condition = calc(...);
    routine[condition](argv);
    

    我们用状态矩阵成功规避了if-else…可以看到,还是用的指针。


    指针是存储-执行模型的计算机工作的必要条件!

    我们再看存储-执行模型的计算机的工作方式:

    • 给定一个地址,CPU就可以取出该地址的数据。
    • 给定一个地址,CPU就可以写入该地址一个值。

    这意味着什么?

    只要想让CPU正常工作,就必须暴露整个内存地址空间给CPU,否则CPU就是一堆毫无用处的门电路,换句话说, 一切来自内存! 操作内存就必然要用指针!


    其实,C语言就是简化版的汇编语言。最终,C语言接力汇编用指针创造了世界。

    不管怎么样,C语言是面向计算机的编程语言,而不是面向业务的编程语言,它映射了计算机的工作方式而不太善于描述业务逻辑,因此,C语言深受黑客,编程手艺人这种计算机本身的爱好者喜爱,却不被业务程序员待见,因为摆弄指针确实太繁琐复杂了,一不小心就会出错。

    存储-执行模型的问题在于,要设计复杂的带外机制防止内存被任意访问,由此而来的就是复杂的分段,分页,访问控制,MMU等机制,当然,这些机制和CPU依靠指针访问内存的工作方式并不冲突。

    把C语言指针用的最绝的应该就是Linux内核的嵌入式链表 struct list_head 了:

    struct list_head {
    	struct list_head *next, *prev;
    };
    

    它可以代表一切,它通过C指针完美诠释了OOD,list_head是世界的基类!

    通过container_of宏,list_head可以转换为任意对象:

    /**
     * container_of - cast a member of a structure out to the containing structure
     * @ptr:        the pointer to the member.
     * @type:       the type of the container struct this is embedded in.
     * @member:     the name of the member within the struct.
     *
     */
    #define container_of(ptr, type, member) ({                              \
            void *__mptr = (void *)(ptr);                                   \
            BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) &&   \
                             !__same_type(*(ptr), void),                    \
                             "pointer type mismatch in container_of()");    \
            ((type *)(__mptr - offsetof(type, member))); })
    

    这个转换背后的依赖,正是指针:
    在这里插入图片描述

    然而,C语言依然对业务编程不友好,前面说了,C语言映射的就是计算机工作方式本身,若想用好C语言,就必须要懂计算机原理,这并不是业务程序员的菜,业务程序员只是编写业务逻辑,并不在乎计算机是如何工作的。

    曾经,计算机还是一群痴迷于技术本身的极客们的玩具,计算机是属于他们的,他们用C编程,用Perl/Python/Bash粘合二进制程序。进入互联网时代,随着越来越复杂的业务逻辑出现,越来越多的职业程序员开始成了多数派,他们开始使用更加业务友好的语言,Java,Go便成功了。

    不能说这些业务编程语言没有指针,只是它们隐藏了指针而已,它们对程序员暴露了更加对业务友好的编程接口和语法,自己在底层处理指针问题,仅此而已。指针是客观存在的,只要你使用的是存储-执行模型的计算机,指针就是一切。


    浙江温州皮鞋湿,下雨进水不会胖。

    展开全文
  • C语言中指针

    2016-10-07 16:04:09
    非常详细的讲解C语言指针合集,是C语言指针学习的非常好资料。
  • C语言指针

    2013-07-08 10:09:36
    C语言指针内容教学参考,介绍C语言中如何应用指针的方法和解释
  • C语言中指针局部变量释放问题

    千次阅读 2019-03-11 21:01:02
    C语言中指针局部变量释放问题1.问题代码2.一次改动3.理论4.佐证测试代码5.总结 1.问题代码 #include &amp;amp;amp;quot;stdio.h&amp;amp;amp;quot; #include &amp;amp;amp;quot;string.h&amp;amp...
  • C语言中指针的作用

    千次阅读 2019-12-22 12:54:10
    指针C语言的一个重要特性。他提供了引用数据结构(包括数组)的元素的机制。与变量类似,指针也有两个方面:值和类型。他的值表示某个对象的位置,而他的类型表示那个位置上所存储对象的类型(比如整数或者浮点数...
  • c语言关于指针

    2012-06-04 07:33:47
    关于c语言中指针的ppt,指针用好,更有利于c语言的开发
  • c语言课件指针

    2014-02-08 15:22:28
    c语言指针极其重要,c语言指针课,指针的应用,
  • 这一片文章很好的讲解的怎么去理解C语言指针运用,对于C语言学习者,有很高的价值
  • C语言中指针数组的概念和定义

    千次阅读 2017-02-05 22:24:54
    C语言中指针数组的概念和定义:概念:1:一个数组的元素值为指针则为指针数组; 2:指针数组是一组有序的指针的 集合 3:指针数组的所有元素都必须是指向相同数据类型的指针定义:类型说明符 * 数组名[数组长度]; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 387,362
精华内容 154,944
关键字:

在c语言中指针是

c语言 订阅