2018年11月

这两天学习C语言,遇到这样一个定义 int* (*a[5])(int, char*); 一眼望去,头大,
找了好多解读总算搞明白了,下面把自己的感想记录一下

网上的结果

我们知道 类型 变量 ;表示的定义一个变量如果是这种形式 类型 变量();表示声明一个函数
这个表达式 int* (*a[5])(int, char*); 从轮廓上看,是声明一个函数,函数的返回值是一个整形的指针

  • int* 表示是一个int型指针;
  • (*a[5])(int, char*)中的a[5]表示是一个有5个元素的数组
  • (*)(int, char*)则表示指向一个函数的指针,该函数有两个参数,第一个参数为int型,第二个是字符指针型
  • 结合前面部分,表示这个函数的返回类型为int型,所以(*a[5])(int, char*)为5个返回类型为int型函数组成的数组
  • 整个结合起来 int* (*a[5])(int, char*); 就是指向5个返回类型为int型函数组成的数组的指针变量,变量名为a.
  • 本质是指向数组的指针,该数组是函数而已。
    上面是百度知道找到的

    我的理解

  • 类型为指针
  • 5个元素的数组
  • 数组的元素为函数的指针
  • 函数的参数有两个
  • 总结起来是,类型为指针的含有五个元素的数组,注意最终是数组

在CSDN论坛上看到的,一个帖子的回复

cheuqoi的回复

前几天我刚刚买了这本书《疯狂Java:突破程序员基本功的16课@李刚》,我看了前3章,感觉还是相当不错的。
尤其是第3章讲的HashMap、HashSet、TreeSet、TreeMap的实现细节,可以说非常透彻。

关于楼主提出的2点,我有点疑问
第一个说法是楼主自己想出来的?还是没记清?正好我手边有书,我把书上原话敲出来:

数组的初始化有两种方式:

  • 静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。
  • 动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。

我觉得这个总结很到位啊,不知道这有什么问题?楼主能说说吗?
书中的代码:

//采用静态初始化方式初始化第一个数组
String[] books = new String[]
{
    "疯狂Java讲义",
    "轻量级Java EE企业应用实战",
    "疯狂Ajax讲义",
    "疯狂XML讲义"
};
//采用静态初始化的简化形式初始化第二个数组
String[] names = 
{
    "孙悟空",
    "猪八戒",
    "白骨精"
};
//采用动态初始化的语法初始化第三个数组
String[] strArr = new String[5];

与楼主的“所谓动态就是使用用new了”好像不是一回事?我仔细翻了书,好像没看到李刚书中有这句话啊。

感觉楼主是自己搞了错误的概念,然后自己“震精”自己啊!

至于楼主说的第二个问题,

String[] a = {"eee"};
String[] b = a;//这个b没有被初始化

就我个人觉得,这种方式我还真不觉得叫初始化!
比如我们初始化一个对象,是不是意味着重新分配内存,如果是对象,是不是要调用这个对象的初始化块、构造器进行初始化?但第二条代码还真没有这些过程!!它只是将一个引用指向另一个已经存在的数组。
例如我们这样写

Object obj1 = new Object();
Object obj2 = obj1;

我觉得这里只初始化了一个Java对象!难道楼主认为这里初始化了几个对象?
再者!我要告诉楼主一个基本概念:对象(包括数组)才需要初始化!

当然,就我个人的感觉,这种概念性的东西其实没必要在名称上纠缠。
让我们来看看书中解释:

始终记住:Java的数组变量是引用类型的变量,它并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中即可使用该数组变量。
...
我们说对数组执行初始化,其实并不是要对数组变量执行初始化,而是要对数组对象执行初始化——也就是为该数组对象分配一块内存空间。虽然上面程序中的prices变量看似没有经过初始化,但执行prices = nums;就会让prices变量直接指向一个已经执行初始化的数组。

我觉得书中的说明其实很中允(注意文中用的是“看似”),恕我技术不行,我实在看不出这段解释有任何问题。
反倒是楼主,你所认为的String[] b = a;语句是初始化!我还真不觉得是初始化!

关于对象初始化,我想说下我的观点。
String[] a = {"test"};
String[] b = a;
b 是经过初始化的。

### wakeUpDoNottLazy的回复
原因:所谓“初始化”是对“对象 ”而言,而不是对象的引用。
那么 b 这个引用,所引用的对象是什么呢?无疑就是 “{"test"}” 这个数组。也就是说 b 所引用的对象在
String[] a = {"test"}; 时经历了初始化。

对象不初始化是不能使用的啊
我在初学 SSH 的时候看过李刚的一本书,怎么说呢。....不完美,但有所获。总体来说不敢恭维。

String[] a = {"test"}; 时经历了初始化。这点我完全同意啊。
我的意思是:
String[] b = a; 这条代码。这里是否有经过初始化呢?你说之前就对数组对象初始化了,这也没错啊。
我想问: 这里到底初始化了几个对象?
只有一个吧!
我觉得String[] b = a; 这条代码没有任何初始化动作吧?\,它只是让一个引用变量指向另一个已有的对象,谈不上什么初始化吧!要说初始化,也是由String[] a = {"test"}; 这条代码完成的!!与String[] b = a无关!!.

CMS系统功能记录

  • 栏目需要增加新窗口打开
  • 留言购买表单,前端需要做一个共用的可以调用
  • SEO集中设置,可以参考fastadmin
  • 后台增加一个在线帮助功能,就用doc.thinklog.net来做