精华内容
下载资源
问答
  • 变量类型判断:变量和哪个关键字先结合,该变量就是什么类型。  例如 (1)int (*p)[n];...以前这两问题一直都不是很清晰,写程序也管不了这么多,只要不出错能跑出结果就行, 其实很多用C的程

    变量类型判断:变量和哪个关键字先结合,该变量就是什么类型。

     例如

    (1)int (*p)[n];   //p先和*结合,故是一个数组指针 ,即指针指向一个数组

    (2) int *p[n];    //p先和[n]结合,故是一个指针数组,即数组里面的成员是指针


    以前这两问题一直都不是很清晰,写程序也管不了这么多,只要不出错能跑出结果就行,

    其实很多用C的程序员对C的基础知识都一知半解。

    这次要给学生讲指针这一章,特意关注了一下。

    而网上一些相关回答也没严格区分,显得十分晦涩。

    这里整理如下:

    数组指针(也称行指针)

    定义 int (*p)[n];

    ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度

    如要将二维数组赋给一指针,应这样赋值:

    int a[3][4];

    int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。

     p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]

     p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

    所以数组指针也称指向一维数组的指针,亦称行指针。

    指针数组

    定义 int *p[n];

    []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。

    如要将二维数组赋给一指针数组:

    int *p[3];

    int a[3][4];

    for(i=0;i<3;i++)

    p[i]=a[i];

    这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]

    所以要分别赋值。

    这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

    还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。

    比如要表示数组中i行j列一个元素:

    *(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]

    P2+1的值为(0x0000FF00+10*sizeof(int)) ---p2的步长。也就是说执行p2+1时,p2要跨过10个整型数据的长度

    展开全文
  • //若栈空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR if(S.top == S.base) return 1; e = *--S.top; return OK; }//Pop void conversion() {//将十进制转化为八进制 SqStack S; int N; int...
  • 如果暂时明确指针指向哪个变量,则可以赋予NULL,如:int除了NULL之外,C++11新标准引入了nullptr来表示一个空指针。nullptr 既不是整型类型,也不是指针类型,nullptr 的类型是 std::nullptr_t,能转换成任意的...

    C/C++中,为了避免野指针(即指针没有指向任何地址)的出现,声明一个指针后,最好马上对其进行初始化。

    如果暂时不明确指针指向哪个变量,则可以赋予NULL,如:

    int

    除了NULL之外,C++11新标准引入了nullptr来表示一个空指针。

    nullptr 既不是整型类型,也不是指针类型,nullptr 的类型是 std::nullptr_t,能转换成任意的指针类型。

    为什么建议使用nullptr代替NULL呢?

    这是因为在C++中,NULL是被定义为0的常量,当遇到函数重载时,就会出现问题。

    比如有下面两个函数时:

    • void foo(int n)
    • void foo(char* s)

    函数重载:C++允许在同一作用域中声明多个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同。

    #include 

    编译上述代码,结果如下图所示,编译器提示有两个函数都可能匹配,产生二义性。

    6bc779e0e40770614cf7dca5e98043c7.png


    而用nullptr,编译器则会选择 foo(char* s)的函数,因为nullptr不是整数类型。

    #include 

    运行结果如下图所示:

    5d810517825285286808dd52377b3af4.png

    因此,当想使用空指针时,优先使用nullptr,而非NULL。

    展开全文
  • JAVA与指针

    2015-05-29 09:37:00
    首先,提个问题:JAVA中没有指针,JAVA中有指针哪个一个对呢? 答:都对,JAVA中没有指针,因为我们能对指针直接操作,像C++那样用->来访问变量。 JAVA有指针,因为JDK中封装了指针。(现在我们就来找到这...

    转自http://blog.sina.com.cn/s/blog_6fd9615d0100y445.html

    JAVA与指针

    首先,提个问题:JAVA中没有指针,JAVA中有指针,哪个一个对呢?

    答:都对,JAVA中没有指针,因为我们不能对指针直接操作,像C++那样用->来访问变量。

    JAVA有指针,因为JDK中封装了指针。(现在我们就来找到这个指针)

     

    我的理解:

    在声明一个对象的时候,其实就是定义了一个指针变量。

     

    注意: 

    1指针变量有两层含义

              1) 指针变量里存的是地址(它指向的变量的首地址)。

              2) 指针变量有类型,类型说明了该指针指向的变量在内存中的范围(大小)。

    2使用创建一个对象包括声明和定义。

    1) 声明是指定义一个指向该对象的指针变量。

    2) 定义是指用new关键字在堆内存中创建了对象,并把他的首地址付给那个指针变量。

    这样,很多概念就很容易理解了。

    一、值传递和引用传递

    举例说明:

    测试程序为:

    public class Student {

    String name;

    }

     

    public class TestClass {

     

    public static void main(String[] args) {

     

    Student stu1;

    stu1 = new Student();

    stu1.name = "小明";

     

    int a = 10;

     

    System.out.println("改变前,stu1名字为" + stu1.name);

    System.out.println("改变前,a的值为" + a);

     

    TestClass myTest = new TestClass();

    myTest.change(a, stu1);

     

    System.out.println("改变后,stu1名字为" + stu1.name);

    System.out.println("改变后,a的值为" + a);

    }

     

    void change(int num, Student student) {

    num = num + 10;

    student.name = "小强";

    }

    }

    运行结果为:

    改变前,stu1名字为小明

    改变前,a的值为10

    改变后,stu1名字为小强

    改变后,a的值为10

     

    在内存中的表示如下:

    转变前:

     

     

     

     

     

     

    JAVA与指针


    转变时:把stu1的值(36DF)传给student,使student指向36DF。小明变成了小强。

    a的值10传给了num,使num变成了20JAVA与指针

     

     

     

     

     

     

     

     

     

    转变后:studentnum两个变量被销毁。

    JAVA与指针

     

     

     

     

     

     

     

     

    所以,stu1指向的内容改变了,a的值不变。这也就是值传递与引用传递的区别。从中也可以看出就Student stu1;理解成声明了一个指向Student类的指针变量就可以了

     

    这里只用String这个类特殊。

    public class TestClass {

     

    public static void main(String[] args) {

     

    String name = "abc";

     

    System.out.println(name);

     

    TestClass myTest = new TestClass();

    myTest.change(name);

     

    System.out.println(name);

    }

     

    void change(String str) {

    str = "abcd";

    }

    }

    运行结果为:

    改变前name为abc

    改变前name为abc

     

    按照前面的分析改变后的结果应该为:abcd,如图:JAVA与指针

     

     

     

     

     

    但是你会发现问题,上文强调过指针的第二层含义为定义了变量在堆内存中的范围也就是name指向的变量只能为三个字母的范围,把name付给strstr也只能指向三个字母范围的变量,“abcd”超出了范围。(其实改为大小相同的“abd”也不行)

    所以JAVA引入了一个字符串池的概念。就是说它会把所已知的字符串放入字符串池,如果你创建新字符串没有使用new关键字,它首先会去字符串池找有没有相同值的字符串,如果有的话就指向它;如果没有的话就会创建新的空间。

    所以在内存中应该为:
    JAVA与指针

     

     

     

     

     

    二、父类与子类

    举个例子,定义一个Father类,一个Son类,测试

    public class Father {

    String name;

     

    Father(String name) {

    System.out.println("Father一个参数构造函数");

    this.name = name;

    }

     

    void drive() {

    System.out.println("骑自行车");

    }

    }

     

    public class Son extends Father {

     

    Son(String name) {

    super(name);

    System.out.println("Son一个参数构造函数");

    this.name = name;

    }

     

    @Override

    void drive() {

    System.out.println("开宝马");

    }

     

    void QQ() {

    System.out.println("聊QQ");

    }

    }

     

    public class Test {

    public static void main(String[] args) {

    Father son1 = new Son("小毛");

    son1.drive();

    }

    }

     

    结果为:

    Father一个参数构造函数

    Son一个参数构造函数

    开宝马

     

     

    内存分析:

    son1为Father类的指针,但new了一个Son类的对象,并把这个对象付给了son1。

    JAVA与指针

     

     

     

     

     

     

     

     

     

     

    new一个子类对象(构造子类对象)的时候,需要先创建父类对象,也就是要调用父类的默认构造函数(无参构造函数),如果父类没有无参构造函数也就是说他的无参构造函数被你重写了,那么子类也不能有无参的构造方法,并且在子类的有参构造方法中必须指明构造父类的构造方法(用Super关键字)

     

     


    展开全文
  • 针对这个问题,我们首先需要了解Java和python的基本含义及应用范围。Java是面向对象的程序...特别是Java语言使用指针,而是使用引用,并提供了自动的垃圾回收机制,使程序员不必为内存管理而担忧。Java可以用于网页...

    针对这个问题,我们首先需要了解Java和python的基本含义及应用范围。

    Java是面向对象的程序设计语言,是目前使用最为广泛的网络编程语言之一,它具有简单,面向对象,稳定,与平台无关,解释型,多线程,动态等特点。

    grey.gif

    Java丢弃了C++中很难理解的运算符重载、多重继承等模糊概念。特别是Java语言不使用指针,而是使用引用,并提供了自动的垃圾回收机制,使程序员不必为内存管理而担忧。

    Java可以用于网页, 企业级开发, 手机应用软件, 游戏后台,应用性编程语言的开发,我们常用的手机APP、网页网站、企业系统等都可以用Java语言编写,适用范围非常广,这就是现在所有编程语言中Java的被使用排名第一的原因。

    Python除了极少的事情不能做之外,其他基本上可以说全能,系统运维、图形处理、数学处理、文本处理、数据库编程、网络编程、web编程、多媒体应用、pymo引擎、黑客编程、爬虫编写、机器学习、人工智能等等都可以做。

    grey.gif

    所以我们在说过人工智能的时候,首先想到的就是python。但是大多数人都只关注了它的功能,却忽略了python其实是一种脚本语言。

    脚本语言通常都有简单、易学、易用的特性,目的就是希望能让程序员快速完成程序的编写工作。但脚本语言并不是软件工程和构建代码结构的最佳选择,也不是"通用”语言,所以脚本语言的可替代性比较强。

    之前我们所说的PHP就是脚本,现在PHP已被过弃,有了新的语言替代,虽说现在人工智能比较火爆,但也不排除说不定多久python也会被另外一种语言所代替。

    grey.gif

    Java和python语言各有各的特点和优势,方向不一样,也是无法做出准确的选择。西安汇杰给大家做一个大概的总结:Java语言,比python学习起来难度大一些,但这个语言被广泛使用,未来的发展还是很好的,而python语言,相比Java来说,简单易懂,但由于是脚本语言,可替代性很强。如果一定要在这两种语言中选择一个的话,我比较倾向Java开发。

    每一个想要掌握IT技术的人,都希望未来能有一个稳定发展的方向,在选择学习哪种语言的时候,不仅要了解语言之间的特点和应用范围,还要结合自身的优势、未来的定位等多方面因素考虑,最好去机构试听几种语言,当然这比较花费时间,一门语言试听四五天之后的判断才较为准确,一门语言试听一节课基本是做不出什么判断的。

    展开全文
  • 针对这个问题,我们首先需要了解Java和python的基本含义及应用范围。Java是面向对象的程序...特别是Java语言使用指针,而是使用引用,并提供了自动的垃圾回收机制,使程序员不必为内存管理而担忧。Java可以用于网页...
  • 读到这里的时候, 有点太理解 “函数本身的类型” 和 函数指针类型在rust内的具体区别, 以及, 是哪个trait/语言特性导致了 函数类型和函数指针的相互转换? 函数调用的时候如果传入一个函数名, 到底传入的是什么? ...
  • 15、翻转链表

    2019-05-29 10:01:38
    定义前中后三个指针,从前往后遍历一遍即可。 出过的错误,在指针的尾部处理部分要注意...最后要返回哪个指针能弄错了。 /* public class ListNode { int val; ListNode next = null; ListNode(int val) ...
  • 搞明白算法就容易了,居然还要处理各种java需要的细节。难度倍增。我直接吐血身亡。。。 解题思路: 这道题的意思是让我们找出一个字符串s的某一个子串。这个子串满足的条件是包含另一个字符串t的所有字符。 那...
  • 平衡二叉树插入一个节点时,往往会造成平衡...重要的是:决定用哪个节点代替失衡节点,只有两个选择,失衡节点的儿子或者失衡节点的孙子。  接下来就好办了,无非就是互换一些子树的一些指针而已。 下面看两个例子...
  • C++ 向上转型初步01

    2020-01-12 10:28:43
    1.编译器通过指针来访问成员变量,指针指向哪个对象就使用哪个对象的数据;编译器通过指针的类型来访问成员函数,指针属于哪个类的类型就使用哪个类的函数。 但是父类 函数如果变成虚函数,子类重写了这个函数, ...
  • 以下观点来源于《深入浅出MFC》 到底调用到哪个函数,必须视指针的原始类型而定,于指针实际所指对象无关。 1.如果你以一个“基类之指针”指向“派生类”,那么经由该指针你只能够调用基类所定义的...
  • 在「对象内存布局」一节中,我们了解到对象头中包含了一个叫做类型指针的东西,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。但是,并是所有的虚拟机都是这么去做的。不同的...
  • 在「对象内存布局」一节中,我们了解到对象头中包含了一个叫做类型指针的东西,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。但是,并是所有的虚拟机都是这么去做的。不同的...
  • ()断点续传的原理

    千次阅读 2008-12-01 11:47:00
    这时服务器还知道客户端要下载哪个文件; 2、向服务器发送“RETR + 文件名”命令,通知服务器要下载的文件名,这时服务器开始定位文件指针读文件并发送数据。 3、客户端定位本地文件指针(文件末尾); 4、两端的...
  • // 定义了一个数组, 里面存储的是char 类型的指针 unsigned short m_nPort; }; struct MULSERVADDR { int m_nProxyType; //代理类型 char m_ucTimeOut; //如果为1就是需要用户验证, 如果为0需要...
  • c++基础

    2014-01-21 16:27:00
    引用和指针 引用是就是对象本身。对应内存 就一个地址。指针对应内存是两个地址。...引用就是直接取了一个别名,需要重新开辟内存来存哪个东西的内存。。 就相当于给对象取了个不同的名字 除了一些特殊...
  • 然后需要设置指针旋转的起点(也就是围着哪个) transform-origin属性来进行设置 完了之后就是js部分了 js想要实现功能第一步肯定是要获取要改变的节点 下一步因为要使咱们的钟表时间和本地时间同步 所以要...
  • 至少有95%企业回答不了以下几个问题:企业到目前为止总共铺设了多少条电缆,每条电缆是哪一年铺设的,已经使用了多少年,最大安全使用年限是多少?是否进行了正常的巡检?今年具体是哪条电缆需要更换吗?您公司布设了...
  • 可我找到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数指定大小...
  • 可我找到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数指定大小...
  • 信息熵(Information Entropy) 所谓熵也就是信息的确定性,也就是混乱程度,举个例子便于理解。 我们玩一个大转盘,有32个格子,分别标了1-32的数字...我现在好了让你猜是哪个数字,你会怎么猜?我会问,是1-1...
  • CString

    2019-05-17 10:26:47
    我倾向于使用指针,而使用复制的方法,即把CString对象的内容复制到字符串数组中,或者把字符串数组的内容复制到CString对象中。这样两个变量同时存在,想用那个用哪个,并且可以随时通过复制来保持一致。 一、...
  • 可我找到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以到无穷。 41 数组大小 42 1.23 能否声明和传入数组大小一致的局部数组,或者由其他...
  • 可我找到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以到无穷。 41 数组大小 42 1.23 能否声明和传入数组大小一致的局部数组,或者由其他...

空空如也

空空如也

1 2 3 4 5 6
收藏数 113
精华内容 45
关键字:

哪个指针转不了