精华内容
下载资源
问答
  • 神奇的指针

    2020-07-22 16:28:40
    神奇指针在哪里 指针是一种数据类型,使用它可以用来定义指针变量,指针变量中存储其实是整数,这种整数代表了内存编号。 == 为什么要使用指针:== 1、函数之间相独立,但有些时候需要共享变量。 传参是值传递 ...

    神奇指针在哪里

    指针是一种数据类型,使用它可以用来定义指针变量,指针变量中存储的其实是整数,这种整数代表了内存的编号。

    == 为什么要使用指针:==
    1、函数之间相独立,但有些时候需要共享变量。
    传参是值传递
    全局变量容易命名冲突
    使用数组还需要传递长度
    命名空间是独立的,但地址空间是同一个,所有指针可以解决这个问题。
    2、由于函数之间传参是值传递(内存拷贝),对于字节数比较多的变量,值传递效率较低,如果传递变量的地址只需要传递4|8字节。
    3、堆内存无法取名字,它不能像data、bss、stack让变量名与内存建立联系,只能使用指针记录堆内存的地址来使用堆内存。

    如何使用指针:
    定义:类型* 变量名_p;
    1、指针变量与普通变量的用法有很大区别,建议在取名以p结尾加心区分。
    2、指针变量与普通变量一样默认值是随机的,一般初始为 NULL。
    3、指针的类型决定了它可以访问多少个字节。
    4、一个只能定义一个指针变量。
    int* p1,p2,p3;// 只有p1 是指针变量,p2,p3都是int类型变量
    int *p1,*p2,*p3; // p1 p2 p3都是指针变量
    赋值:变量名_p = 地址;
    指向栈内存:
    int* p = #
    指向堆内存:
    int* p = malloc(4);
    解引用:*p
    通过指针变量中记录的内存编号去访问内存,该过程可能产生段错误,原因是里面存储的内存编号是非法的。注意:访问的字节数由指针变量的类型决定。
    练习1、实现一个变量交换函数,调用它对一个数组进行排序。
    void swap(int* p1,int* p2);
    练习2、实现个函数计算两个整数的最大公约数,和最小公倍数,最大公约数用return返回,最小公倍数使用指针处理。
    3 6 3
    3 6 6

    使用指针要注意的问题:

    1. 空指针:值为NULL的指针变量叫空指针,如果进行解引用就会产生段错误。
      NULL也是一种错误标志,如果一个函数返回值是指针类型,当函数执行出错返回值就是NULL。
      如何避免空指针带来的段错误:使用来历不明的指针前做一判断。
      1、当函数的参数是指针,别人传给你的就有可能是空指针。
      2、从函数获取的返回值也可能是空指针。
      if(NULL == p)
      注意:NULL在绝大多数系统中是0,在个别系统中是1。
      2.野指针:指向不确定的内存空间。
      解引用野指针的后果:
      1、段错误
      2、脏数据
      3、一切正常
      野指针比空指针的危害更严重,因它无法判断出来,而且可能是隐藏型的错误短时间内不暴露出 来。
      所有的野指针都是程序员自己制造出来的,如何避免产生野指针:
      1、定义指针变量时一定初始化。
      2、函数不返回栈内存的地址。
      3、指针指向的内存释放后,指针变量要及时置空。

    指针的运算:
    指针变量中存储的是整数,理论上整型数据可以使用的运算符它都可以用,但大多数运算都无意义的。
    指针+n <=> 宽度n+指针 前面n个元素
    指针-n <=> 指针-宽度
    n 后退n个元素
    指针-指针 <=> (指针-指针)/宽度 计算出两个指针之间相隔多少个元素

    const与指针:
    const int* p; 指针所指向的内存不可修改。当我们为了提高传参的效率而使用指针时,传参的效率高了,但变量也有被修改的风险,这种写法可以保护指针所指向的内存.
    int const *p; 同上
    int * const p; 指针变量不可被修改
    const int* const p; 指针变量和指针所指向的内存都不可修改。
    int const * const p; 同上

    指针数组与数组指针:
    指针数组:就是由指针组成的数组,它的成员是指针变量。
    类型* arr[长度];
    数组指针:专门指针数组的指针。
    类型 (*arr)[长度];

    #include <stdio.h>
    int main(int argc,const char* argv[])
    {
       int arr[10] = {0,1,2,3,4};
       int* p = (int*)(&arr+1);
       printf("%d\n",*(p-1));
       int (*p1)[5] = &arr;//存放的是地址即指针
       printf("%p %p\n",p1,&arr);
       for(int i=0; i<5; i++)
       {
       	printf("%d\n",(*p1)[i]);
       }
    }
    

    指针与数组名:
    数组名是一种特殊的指针,它是常量,不能修改它的值,它与数组的内存是映射关系。
    数组名 == &数组名 数组的首地址
    指针变量有自己的存储空间,如果它存储是数组的首地址,指针可以当数组使用,数组名也可以当指针使用。
    数组名[i] == *(数组名+1)
    数组作为函数的参数时入脱变成了指针,所以长度丢失。得到的就是首地址

    #include<stdio.h>                                                           
     
    int main(int argc,const char*argv[])
     {   
        int  a[5]={1,2,3,4,5};
        int* p=((int*)(&a));
        //int* p=a;同上
        printf("%p %p %p %p\n",p,a,&a,&a[0]);
        //数组a就是首地址 &a地址 &a[0]地址
        printf("%d %d %d %d\n",*a,*p,a[0],*(&a[0]));
       *p=3;
         //解引用赋值 指向地址的地方赋值
         for(int i=0;i<5;i++)
         {
             printf("%d  ",*p+i);
         }
         for(int i=0;i<5;i++)
         {
             printf("%d  ",*(a+i));
         }
             printf("\n%d\n",(a+3)-(a+1));
             printf("%p %p\n",&a[5],&a[4]);
             printf("%p\n",&a+1);
     }
    //(自己的更好得观察指针数组的关系)
    0xbfa28130 0xbfa28130 0xbfa28130 0xbfa28130
    1 1 1 1
    3  4  5  6  7  3  2  3  4  5  
    2
    0xbfa28144 0xbfa28140
    0xbfa28144
    
    

    二级指针:
    二级指针就是指向指针的指针,里面存储的是指针变量的地址。
    定义:类型** 变量名_pp;
    赋值:变量名_pp = &指针;
    解引用:
    ·*变量名_pp <=> 指针
    **变量名_pp <=> *指针
    函数指针:
    函数名就个地址(整数),它代表函数在代码段中所处的位置。
    函数指针就是指向函数的指针,它里面存储是函数在代码段中所处位置(函数名);
    typedef 返回值 (*函数指针)(类型1 参数名1,类型2 参数名2…);
    函数指针 fp;
    > 指针以及数组之间的转换赋值,学的还是皮毛。上面所记录的也没有太深入的理解;在这里插入图片描述

    展开全文
  • 是自己对指针的理解,希望对大家有用:指针

    是自己对指针的理解,希望对大家有用:指针

    展开全文
  • 这是一个不错资料,值得看看,相信你会从中学到很多东西
  • 本来好好的指针,结果输出结果是这样,, 哎。 第一个的输出比较容易理解,是第二个字符串的第五个字符,而第二个输出的结果却是不以所然,,,,, 转载于:...
    #include<iostream>
    using namespace std;
    
    void main()
    {
    	char *a[10]={"0123456789","abcdefghij"};
    	//char *q=a[10];
    	cout<<*(*(a+1)+4)<<endl;
    	cout<<*(*a+2)<<endl;
    	cout<<endl;
    }

    运行及果是这样子。



    本来好好的指针,结果输出结果是这样,,

    哎。

    第一个的输出比较容易理解,是第二个字符串的第五个字符,而第二个输出的结果却是不以所然,,,,,

    转载于:https://www.cnblogs.com/acmwangpeng/p/5524906.html

    展开全文
  • 现遇到一个非常奇怪问题, 大致代码如下: bool A:Init ( point ) { m_pPoint = point; if( m_pPoint != point ) { return false; } return true; } 此段代码在Release编译下运行函数...
  • 指针很简单------引子学计算机语言,首先推荐C语言.无论是数据结构还是算法,站在...C语言之所以经久不衰,就是因为指针的存在.本篇将帮助大家突破指针这个瓶颈.1.指针指针变量(通常我们叙述时会把指针变量简称为指针...

    指针很简单

    ------引子

    学计算机语言,首先推荐C语言.无论是数据结构还是算法,站在C语言的角度,会让我们理解的更加清晰透彻.

    但是,指针不太"友好",让很多人抓狂,头疼.不少人选择了放弃,绕行.百度上有千千万个解决方法,而我们放弃的理

    由和简单,路在脚下,向前还?是向后?

    C语言之所以经久不衰,就是因为指针的存在.本篇将帮助大家突破指针这个瓶颈.

    1.指针和指针变量(通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样)

    指针:0x7ffe38fea3e0

    指针变量:char *data;(*data就是指针变量)

    2.指针和函数的关系(给子函数传多个值时用到(注意:你要不知道给什么,请自觉抄写关于指针案例,10遍))

    需要提前掌握:函数的设计(返回值  函数名 参数),不清楚,请问百度;

    子函数能不能静态申请空间,动态呢?会出现啥情况?

    子函数什么时候是指针?

    函数可以返回地址码?

    此时此刻,热心网友早已经为我们准备好了,我们耐心的去博客园/csdn找,绝对可以找到,讲的非常专业.

    3.指针与字符串

    这个也百度,当然我不是糟老头啊.对于很对新人来说,缺少的是独自探索能力,遇到问题先去文别人,不懂的地方都是,这个老师没讲,那个书本没有,对于程序员而言,我们需要自己想办法.如果一直依靠问别人,是远远不够的.

    4.指针数组、二级指针、函数指针、指针函数、二维数组、void  *

    指针数组:是一个数组,每一项都是指针(处理多个字符串)

    案例:char *str[5] = {NULL};

    二级指针:

    int data = 0;

    int *p = NULL;

    p = &data; 

    int **q = NULL;

    指针数组也是(不知道,不知道百度回炉数组去)

    函数指针:

    回调函数是啥?

    函数如何作为另一个函数的参数,有啥案例?

    自己百度!

    指针函数:(函数参数返回值是指针的函数)

    二维数组: char[2][3]data;(有2个空间,每个空间大小为3)

    void *:“不确定类型指针

    当我们接触到新的知识时,反复的查找,总结练习,才能达突破某一瓶颈,抵达下一个佳境,C语言的开发速度很难跟上社会需求的速度,前人为我们已经整理好了很多宝贵的心得.但是探索精神需要稀缺,还是那句话,不会百度想办法,当你工作几年后你会感谢曾今的自己,知识、机会向来都是自己去找的.

    多百度,多和同事交流,多看书,多总结,成功都是在这些废话中.

    Swift3&period;0语言教程使用指针创建和初始化字符串

    Swift3.0语言教程使用指针创建和初始化字符串 Swift3.0语言教程使用指针创建和初始化字符串苹果的Swift团队花了不少功夫来支持C的一些基础特性.C语言中为我们提供了指针,Swift也不例 ...

    C语言中的指针数组

    C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...

    【ZZ】C 语言中的指针和内存泄漏 &amp&semi; 编写高效的C程序与C代码优化

    C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...

    GO语言中的指针

    http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...

    由链表初始化看C语言的二级指针

    先来看C语言创建链表.插入节点和遍历链表的一段代码: #include #include typedef int ElemType; ...

    C语言 &gt&semi; 数组和指针

    C语言 数组和指针 const: 关于指针和const需要注意一些规则.首先,把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的. 然而,只能把非const数据的地 ...

    C语言结构体指针的引用问题

    在写栈的一个应用时遇见这样的一个问题 SqStack s; s->base = (int*)malloc(sizeof(int)*10); 通过这样一个代码引用的时候,会导致程序出现异常 经过一 ...

    Go语言基础之指针

    区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 Go语言中的函数传参都是值拷贝 ...

    c语言之函数指针应用

    c语言之函数指针应用 1.函数指针与指针函数 在开始运用函数指针前,我们需要将两个概念即:函数指针与指针函数搞清楚. 函数指针,指明这个一个函数,但返回值为指针类型,语法格式为: 类型名* 函数名A( ...

    随机推荐

    Entity Framework 6 Recipes 2nd Edition 译 -&gt&semi; 目录 -持续更新

    因为看了这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...

    c&num; json总结

    json确实很好用,但是网上写的很多都很复杂,不适合自己,然后每次写了又记不住,又要反复找,所以将其中的代码写下来.以后看这个就可以了 都引用了 Newtonsoft.Json 1.ashx,asmx ...

    Tomcat性能参数设置

    Tomcat性能参数设置 Tomcat性能参数设置 博客分类: Java LinuxTomcat网络应用多线程Socket 默认参数不适合生产环境使用,因此需要修改一些参数 1.修改启动时内存参数.并 ...

    IOS编程User Interface基础

    IOS编程之User Interface基础 目录 概述 相关概念 常见问题 状态栏的隐藏 应用图标的设置 概述 IOS用户界面是APP呈现给用户最直观.最常用的方式,因此学会用户界面的编程是学习IO ...

    通过select选项动态异步加载内容

    通过监听select的change事件来异步加载数据. 1:效果图: 选择Good: 选择 Bad: 2:index.html

    【MySQL】filesort&period;cc 源代码阅读笔记

    最近阅读了部分MySQL排序的代码,把心得记录一下. 参考代码 MySQL: 文件: filesort.cc 函数: filesort() 排序过程伪代码 function filesort(tabl ...

    引擎设计跟踪&lpar;九&period;14&period;3&period;2&rpar; Deferred shading的后续实现和优化

    最近完成了deferred shading和spot light的支持, 并作了一部分优化. 之前forward shading也只支持方向光, 现在也支持了点光源和探照光. 对于forward sh ...

    django全流程--青空琉璃

    @python相关 1.多线程与多进程 https://zhuanlan.zhihu.com/p/45828888 2.用日志logging模块取代print() https://blog.csdn. ...

    FCM算法的matlab程序

    FCM算法的matlab程序 在“FCM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

    centos下添加epel源

    RHEL以及他的衍生发行版如CentOS.Scientific Linux为了稳定,官方的rpm repository提供的rpm包往往是很滞后的,当然了,这样做这是无可厚非的,毕竟这是服务器版本,安 ...

    展开全文
  • 二进制数据序列化反序列化和Json序列化反序列化重要区别  前言:最近一个一个很奇怪问题,很明白说,就是没看懂,参照下面代码: /// <summary> /// 反序列化对象 /// </...
  • 神奇指针

    2019-10-07 19:07:16
    父类与子类之间转换 很迷 很神奇 &与*的神奇功效还有待探索 今日研究二叉树,对setRight与setLeft函数作用有点疑惑 以下为自己小思考,仅供参考 版本一 #include<iostream> using namespace std; ...
  • 神奇的C++——指针

    2020-02-10 22:37:55
    神奇的C++——指针 前言 学过C++或者C的同学可能都知道,它们和java、python这些最不一样的就是拥有指针——高级而又强大。 今天看书的时候,又看到了关于指针的内容,想起记录下来,或多或少留点记录。不周全的以后...
  • 神奇的多级指针!(指针的嵌套)

    千次阅读 2017-10-27 09:27:00
    今天发现指针神奇,难道这就是指针的嵌套吗? 下面请看代码! #include using namespace std; int main() {  int i=5;  int *p,**q,***l,****k;  p=&i;  q=&p;  l=&q;  k=&l;  cout  ...
  • js中神奇的函数指针

    千次阅读 2016-08-15 10:16:33
    js中的函数指针是一个神奇的东西 定义function check(){};对于上面这个函数,check(函数名)就是函数指针,check指向函数主体,如果alert(ckeck),那么弹出的信息就是function(){…}函数名就是函数指针,并且指向函数...
  • C++是一种对类型匹配非常严格的语言,而对于数组来说,指针类型分为两种,一种是元素类型指针(指向元素),另一种是数组类型的指针(指向数组),也就是指向指针的指针。 数组名本身代表的是数组首元素的地址,所以...
  • 关于指针的浅析,神奇的指针传递 往往在其他高级语言中,比如java,.net等中,我们的函数传递参数的时候,都是采用值传递的过程,专业术语叫做:值拷贝,我们传递的参数都不是原来的参数,而是一种拷贝过后的参数,...
  • 函数指针的神奇

    2010-06-13 20:08:00
    #include"stdafx.h"#include <stdio.h>int main(){ const shortint c1 = 49920;... //直接定义函数指针 //int (*pf)() = (int (*)())&c2; 其实就是把局部变量当作代码来执行 int/*函数返...
  • 最近遇到一个神奇的bug:delete野指针没有崩溃。 解决过程 查了很多资料,大致意思是c++没有定义delete野指针的行为,所以delete野指针的行为不可定义,即有可能崩溃也有可能不崩溃。印象比较深刻的一个比喻是:...
  • 牛客地址:神奇的数字 思路: 采用双指针的方法,设置头指针left和尾指针right,然后先用left往后遍历找到偶数,right往前遍历找到偶数, 然后交换left,right所指向的值,同时需要将left++,right-- 时间复杂度: ...
  • 神奇的数组与函数指针

    千次阅读 2010-04-06 17:32:00
    前段时间,关于梯形图转指令表确实让人蛋疼(实际上到现在还没“消停”),因为“他”转换使用了“函数指针”。比如常见LD、LDI、OR、ORI、OUT、AND等等指令,在构造指令表时候,有没有想过自己switch,比如...
  •     如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中环,我们使用整数 pos 来表示链表尾连接到链表中位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中...
  • 在论坛上看到类似下面一段代码: a.c: int a[10]={1,2,3,4,5,6,7,8,9,0}; int *b = a; b.c: extern int *a; extern int b[]; void main() { int x, y; x = a[3]; y = b[3]; } 编译后运行,在main函数中,x和y分别...
  • 下面是使用结构体接口抽象定义,其实就是将结构体存进一个 map里。由于是读写都比较频繁,我加了读写锁。 // add progress listener. func (upload *UploaderGateway) AddProgress(key string, v ProgressListener...
  • 从开始接触C语言到现在也算有两年了,还是会偶尔遇到一些神奇的问题。 例子1 int a[10]; printf( "%d-%d", a, & a); 猜测:这里的&会被编译器忽略。a在内存中是不存在的,内存中的是a[0] a[1]....a[9],上述printf...
  • ``` struct QNode { int* data; ...这样子不能对Q操作,显示不允许指针指向不完整类型。 ``` typedef struct QNode* Queue; void Pop(Queue Q) { } ``` 这样就可以,这是为什么?

空空如也

空空如也

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

神奇的指针