精华内容
下载资源
问答
  • 1. 数组作为参数传递给函数时,可以通过 sizeof 得到数组的大小吗 答案是不可以。...数组名不能放在赋值运算符的左边(它不是一个左值,更不是一个可修改的左值)。一个数组是一个对象,而它的数组名就是...

    1. 数组作为参数传递给函数时,可以通过 sizeof 得到数组的大小吗

    答案是不可以。当把数组作为函数的参数时,你无法在程序运行时通过数组参数本身告诉函数该数组的大小,因为函数的数组参数相当于指向该数组第一个元素的指针。 

    2. 可以把另外一个地址赋给一个数组名吗

    答案是不可以。数组名不能被放在赋值运算符的左边(它不是一个左值,更不是一个可修改的左值)。一个数组是一个对象,而它的数组名就是指向这个对象的第一个元素的指针。

    给数组名赋值是毫无根据的。一个指针的含义是 “这里有一个元素,它的前后可能还有其他元素” ,一个数组名的含义是 “这里是一个数组中的第一个元素,它的前面没有数组元素,并且只有通过数组下标才能引用它后面的数组元素” 。因此,假如需要使用指针,就应该使用指针。

    3. 指针是什么

    指针是变量。系统为指针分配内存空间;指针有自己的地址;指针能够存值,但这个值比较特殊,存的是地址。

    4. 怎样判断指针的类型和指针所指向的类型

    从语法的角度看,只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型,这是指针本身所具有的类型。

    例:

    1)int *ptr;          //指针的类型是 int*

    2)int **ptr         //指针的类型是 int**

    3)int *(*ptr)[4]       //指针的类型是 int *(*)[4]

    通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当作什么来看待。

    从语法上看,只须把指针声明语句中的指针名字和名字左边的指针声明符 “*” 去掉,剩下的就是指针所指向的类型。

    例如:

    1)int *ptr;         //指针所指向的类型是 int

    2)int **ptr;       //指针所指向的的类型是 int*

    3)int *(*ptr)[4];      //指针所指向的的类型是 int *()[4]

    5. 常量指针和指针常量的区分

    举例说明:

    1)const char *p;

    2)char* const p=a;

    语句 1 定义了一个常量指针,即指向一个常量的指针,指向的内容是常量,不可修改,放在常量区的,但指针本身可以修改,即 " *p = 'b' " 是非法的,*p 是 p 指向的常量的第一个字符,是个常量,不能改变的。"p = &q" 这是可以的,指针可以指向不同的地址。

    语句 2 定义了一个指针常量,即指针本身是个常量,不可修改,但指针指向的内容可以修改,一开始定义时让它指向数组 a ,"*p = 'b'" 这是可以的,但 "p = &b" 是非法的。

    const 常量 * 指针,当 const 在 * 之前就是常量指针,而 const 在 * 之后,就是指针常量。例如,"const char*p”即 char *p 是个常量,所以内容是常量,"char* const p; " 即指针 p 是个常量。

    6. 常量指针和指针常量使用的注意点

    1)如果指针常量指向的是字符指针变量,那么当修改*p时,原则上能够修改,在编译时能通过,但在运行时不能通过,因为它试图去修改常量区的内容,显示是非法的。

    2)当指针常量指向一个另外一个指针时,当这个指针指向别的内容时,那么指针常量还是指向原先的内容。

    7. 什么是空指针?空指针有什么用?   

    空指针是不指向任何对象的指针。空指针的值是NULL,即0。空指针可以作为一个链表的终值。如果一个链表的最后一个指针指向NULL,则该链表已经结束。

    注意:绝对不能间接引用一个空指针,否则,程序可能会得到毫无意义的结果,或者得到一个全部是 0 的值,或者会突然停止运行。

    8. C语言为什么要提出指针

    C语言可以直接访问硬件,而访问时需要硬件的地址。

    9. 指针数组和数组指针的区别

    指针数组:定义一个数组,数组里包含 n 个指针变量;

    数组指针:定义一个指向含 n 个数据元素的数组的指针。

    10. 函数指针和指针函数的区别

    函数指针:即指向这个函数的指针,定义为 “数据类型 (*fun)(参数列表);”,()优先级比 * 高,所以 *fun 加括号,如 "void (*fun)(int*, int*); ” 。

    指针函数:即返回值是指针的函数,定义为 “数据类型 *fun(参数列表); ”,如 "char* fun(int*,int*);",即返回值为 char* 型。

    展开全文
  • 在使用final修饰基本类型变量的时候,不可以对基本类型变量重新赋值,所以的话,基本类型变量不能改变,可是对于引用类型变量来说的话,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变...

    下面要给大家讲到的就是java final修饰基本类型变量与引用类型变量的区别方面的知识,你知道他们有什么区别吗?一起来详细的了解一下吧。

    在使用final修饰基本类型变量的时候,不可以对基本类型变量重新赋值,所以的话,基本类型变量不能被改变,可是对于引用类型变量来说的话,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,也就是一直引用同一个对象,但这个对象完全可以发生改变。

    下面的程序示范final修饰数组和Person对象的情形。import java.util.Arrays;

    class Person

    {

    private int age;

    public Person()

    {}

    // 有参数的构造器

    public Person(int age)

    {

    this.age = age;

    }

    // 省略age的setter和getter方法

    // age 的 setter 和 getter 方法

    }

    public class FinalReferenceTest

    {

    public static void main(String[] args)

    {

    // final修饰数组变量,iArr是一个引用变量

    final int[] iArr = {

    5

    , 6

    , 12

    , 9

    };

    System.out.println(Arrays.toString(iArr));

    // 对数组元素进行排序,合法

    Arrays.sort(iArr);

    System.out.println(Arrays.toString(iArr));

    // 对数组元素赋值,合法

    iArr[2] = -8;

    System.out.println(Arrays.toString(iArr));

    // 下面语句对iArr重新赋值,非法

    // iArr = null;

    // final修饰Person变量,p是一个引用变量

    final Person p = new Person(45);

    // 改变Person对象的age实例变量,合法

    p.setAge(23);

    System.out.println(p.getAge());

    // 下面语句对P重新赋值,非法

    // p = null;

    }

    }

    使用final修饰的引用类型变量不能被重新赋值,可是可以改变引用类型变量所引用对象的内容。

    例如上面iArr变量所引用的数组对象,final修饰后的iArr变量不能被重新赋值,但iArr所引用数组的数组元素可以被改变。

    与此类似的是,p变量也使用了final修饰,表明p变量不能被重新赋值,但p变量所引用Person对象的成员变量的值可以被改变。

    注意一下,在使用final声明变量的时候,要求全部的字母大写,例如SEX,这在开发当中是很重要的。

    假如一个程序当中的变量使用public static final声明,那么这个变量将称为全局变量。

    如:public static final String SEX= "女";

    以上这两者的区别了,请多多的关注奇Q工具网吧,更多java入门知识,可以为你分享。

    推荐阅读:

    展开全文
  • 在Java中,数组和String字符串都不是基本数据类型,它们当作类来处理,是引用数据类型。引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。 在java里面除去基本数据类型的其它...

    答案是肯定的。⭐️8个基本类型是值类型,其他都是引用!!

    在Java中,数组和String字符串都不是基本数据类型,它们被当作类来处理,是引用数据类型。
    引用类型(reference type)指向一个对象不是原始值,指向对象的变量是引用变量。


    在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。
    在java编程语言中,用类的一个类型声明的变量被指定为引用类型,这是因为它正在引用一个非原始类型,这对赋值具有重要的意义。如下代码:
    int x = 5;
    int y = x;
    String s = "Hello";
    String t = s;
    四个变量被创建:两个原始类型 int 和两个引用类型String。x的值是5,而这个值被复制到y;x和y是两个独立的变量且其中任何一个的进一步的变化都不对另外一个构成影响。至于变量s和t,只有一个String对象存在,它包含了文本"Hello",s和t均引用这个单一个对象。如果将变量t重新定义为t="World";则新的对象World被创建,而t引用这个对象。

     

    “在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。

    举例:

    为什么String str="scce";
    String str2="scce";
    str==str2返回true而String str2=new String("scce"); str==str2返回false

    String str="scce"; //这是在静态数据区创建了一个对象
    String str2="scce"; //创建静态数据对象是先在静态数据区查,如果存在则不创建新的,保证静态数据区中的数据只有一份,

    str==str2返回true //指向同一个对象
    String str2=new String("scce"); str==str2返回false //在堆中创建一个对象,引用值当然不同

    Stirng特殊在如果静态数据区中存在,那么不创建新的对象,而是指向这个对象。

    展开全文
  • 注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null.对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始化,static属性在类加载,...
  • 零起点学通C++多媒体范例教学代码

    热门讨论 2010-11-30 09:35:13
    14.10 在对象数组中初始化成员变量 14.11 指针数组 14.12 枚举常量与数组 14.13 多维数组 14.14 多维数组的初始化 14.15 字符数组 14.16 重载数组下标操作符 14.17 总结 第15章 链表 15.1 声明链表结构 15.2 简单的...
  • 14.10 在对象数组中初始化成员变量 14.11 指针数组 14.12 枚举常量与数组 14.13 多维数组 14.14 多维数组的初始化 14.15 字符数组 14.16 重载数组下标操作符 14.17 总结 第15章 链表 15.1 声明链表结构 ...
  • 接下来就是看co里面如何处理这个compose处理过的generator对象了 <p><strong>再回顾一下co</strong></p> <pre><code> javascript function co(gen) { var ctx = this; var args = slice.call(arguments...
  • 11.11 什么可以被重载,什么不可以 182 第12章 继承 183 12.1 什么是继承和派生 183 12.1.1 复杂的继承和派生 183 12.1.2 继承和派生如何在c++中实现 184 12.1.3 继承的种类及语法 185 12.1.4 单一继承 185 ...
  • PHP新手上路.CHM

    2010-04-12 11:48:26
    注意不同的是被单引号引出的字符串是以字面定义的,而双引号引出的字符串可以被扩展。而且,在双引号字符串中可以使用反斜杠(\)在字符串中加入转义序列和转换字符。举例如下: $first = 'Hello'; $second = "World...
  • ES6-const使用总结

    2021-02-03 16:53:29
    es6新增了const用来定义常量,声明之后不允许改变 如下: 修改const声明的变量会...对于对象赋值,const指向的仅仅是他的地址,cosnt仅仅是保证这个地址不改变,至于地址对应的数据,是可以进行改变的。 数组对象

    es6新增了const用来定义常量,声明之后不允许改变
    如下:
    修改const声明的变量会直接报错
    在这里插入图片描述
    但是,const声明的变量真的不可以改变吗?
    我们来看一个例子:

    const obj = {name: "张三", age: 10}
    obj.age = 18;
    

    此时我们打印obj会发现age被改变了
    在这里插入图片描述

    这是什么原因呢?

    在计算机中,常量是放在栈中的,而对象是放在堆中的。
    对于对象赋值,const指向的仅仅是他的地址,cosnt仅仅是保证这个地址不改变,至于地址对应的数据,是可以进行改变的。
    数组同对象是一个道理,也是放在堆中的,所以数组的值也是可以改变的,如下:
    在这里插入图片描述
    那么,如何使对象或数组的值不被更改呢?

    Object.freeze(obj)

    Object.freeze(obj) 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。
    我们再使用上面的例子试一下,在修改之前使用Object.freeze(obj),看看是什么效果
    在这里插入图片描述
    我们会发现在Object.freeze(arr)之后再去修改arr[0]已经不生效了
    但是,Object.freeze只是浅层次的冻结,什么意思呢?我们再来看一个例子就了解了

    const myobj = {
      name: "张三",
      age: 10,
      score: [20, 80, 85]
    }
    Object.freeze(myobj);
    myobj.score[0] = 70;
    console.log(myobj);
    

    在这里插入图片描述
    我们会看到obj.score[0]还是被更改为70了
    Object.freeze不能冻结嵌套深层次的对象,那么我们想深层冻结,怎么办呢?
    我们可以自己写一个递归方法去调Object.freeze来实现

    深层冻结变量

    function myFreeze(obj) {
      Object.freeze(obj); // 冻结第一层
      Object.keys(obj).forEach(function (key) {
        // 循环obj的key,判断当前key的类型,如果是object,则递归调用myFreeze
        if (typeof obj[key] === 'object') {
          myFreeze(obj[key]);
        }
      })
    }
    

    我们来调用一下,myobj.score[0]真的没有被修改
    在这里插入图片描述

    展开全文
  •  2.18 既然数组可以用作数组的基地址,为什么对结构不能这样?  2.19 程序运行正确,但退出时却“core dump ”(核心转储)了,怎么回事?  联合  2.20 结构和联合有什么区别?  2.21 有办法初始化联合吗? ...
  • 2.18 既然数组可以用作数组的基地址,为什么对结构不能这样? 2.19 程序运行正确,但退出时却“core dump ”(核心转储)了,怎么回事? 联合 2.20 结构和联合有什么区别? 2.21 有办法初始化联合吗? 2.22 有没有一...
  • 2.18 既然数组可以用作数组的基地址,为什么对结构不能这样? 58 2.19 程序运行正确,但退出时却“core dump ”(核心转储)了,怎么回事? 58 联合 59 2.20 结构和联合有什么区别? 59 2.21 有办法初始化联合...
  • 2.18 既然数组可以用作数组的基地址,为什么对结构不能这样? 58 2.19 程序运行正确,但退出时却“core dump ”(核心转储)了,怎么回事? 58 联合 59 2.20 结构和联合有什么区别? 59 2.21 有办法初始化联合...
  • 2.18 既然数组可以用作数组的基地址,为什么对结构不能这样? 2.19 程序运行正确,但退出时却“core dump ”(核心转储)了,怎么回事? 联合 2.20 结构和联合有什么区别? 2.21 有办法初始化联合吗? 2.22 有没有一...
  • 数组不能被赋值  6.5 为什么不能这样向数组赋值?externchar*getpass();charstr[10];str=getpass("Enterpassword:");  6.6 既然不能向数组赋值,那这段代码为什么可以呢?intf(charstr[]){if(str[0]=='\0')str=...
  •  数组不能被赋值 6.5 为什么不能这样向数组赋值?externchar*getpass();charstr[10];str=getpass("Enterpassword:"); 6.6 既然不能向数组赋值,那这段代码为什么可以呢?intf(charstr[]){if(str[0]=='\0')str=...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    数组不能被赋值 6.5 为什么不能这样向数组赋值?externchar*getpass();charstr[10];str=getpass("Enterpassword:"); 6.6 既然不能向数组赋值,那这段代码为什么可以呢?intf(charstr[]){if(str[0]=='\0')str=...
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    学生提问:为什么我创建Java对象时从未感觉到java.lang.Object的构造器调用过? 150 5.7 多态 151 5.7.1 多态性 151 5.7.2 引用变量的强制类型转换 152 5.7.3 instanceof运算符 154 5.8 继承与组合 154 ...
  • 数组不能被赋值 66 6.5 为什么不能这样向数组赋值?extern char *getpass(); char str[10]; str=getpass(Enter password:); 66  6.6 既然不能向数组赋值,那这段代码为什么可以呢?int f(char str[]){ if(str[0...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    2.18 既然数组可以用作数组的基地址,为什么对结构不能这样? 29 2.19 程序运行正确,但退出时却“core dump ”(核心转储)了,怎么回事? 29 联合 30 2.20 结构和联合有什么区别? 30 2.21 有办法初始化...
  • 21天学通C++ (中文第五版)

    热门讨论 2010-06-23 16:57:03
    13.2 使用对象数组 13.2.1 声明多维数纽 13.2.2 初始化多维数组 13.3 指针数组 13.4 指针算术 13.5 在自由存储区声明数组 13.5.1 数组指针和指针救组 13.5.2 指针和数组名 13.5.3 删除自由存储区中的数组 ...
  • o 7.4 那么为什么作为函数形参的数组和指针申明可以互换呢 ? o 7.5 如果你不能给它赋值, 那么数组如何能成为左值呢 ? o 7.6 现实地讲, 数组和指针地区别是什么 ? o 7.7 有人跟我讲, 数组不过是常指针。 o ...
  • SQLHelper.cs

    热门讨论 2009-03-09 10:22:10
    通过使用 CacheParameterSet 方法,可以缓存 SqlParameter 对象数组。此方法通过将连接字符串和命令文本连接起来创建一个键,然后将参数数组存储在 Hashtable 中。 要从缓存中检索参数,请使用 ...
  • 通过使用 CacheParameterSet 方法,可以缓存 SqlParameter 对象数组。此方法通过将连接字符串和命令文本连接起来创建一个键,然后将参数数组存储在 Hashtable 中。 要从缓存中检索参数,请使用 ...
  • 15.2 什么可以被注解 244 15.3 注解参数 245 15.4 注解实现 246 15.5 针对Java特性的注解 247 15.5.1 Java修饰符 247 15.5.2 标记接口 248 15.5.3 受检异常 249 15.5.4 变长参数 249 15.5.5 JavaBeans 250 ...

空空如也

空空如也

1 2 3 4
收藏数 74
精华内容 29
关键字:

对象数组可以被赋值吗