LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: cxh_nuaa_2001

关于在C/C++中数组不能直接赋值的问题

[复制链接]
 楼主| 发表于 2006-5-19 02:36:51 | 显示全部楼层
Post by manphiz
我所说的是C/C++语言的处理方式。对于

int p[10]

来说,p的类型是

int [10]

是个数组。对于

int* q = new int[10];

来说,q是个指向数组首地址的指针。两者类型不同,但操作方式相同,因为两者底层处理方式是一样的。

另一方面,你能new一个指向数组的指针吗?不能。因为数组本身并不是一个完整的类型。因此需要像上个例子那样做。而且在delete的时候需要指出你是在delete一个变量还是数组:

delete[] q;

数组归根结底是用来操作一组连续空间内相同类型变量的方式。如果需要数组赋值,可以使用C++中的容器来代替数组。当然这是类,而不再是简单的数组了。



你说的我都知道,但是我认为我们考虑问题的出发点好像不一样。我认为你考虑这个问题的出发点视从C/C++处理数组的方法的一个既成事实的角度去考虑的。假如C/C++不是现在这个样子,它把数组看成和class一样的地位,p的类型是int[10],
    int[10] *q = &p;//p不在是数组的首地址,而是数组变量。q 是指向数组int[10] p的指针
(*q)代表的就是数组p,访问数组p的第i+1个元素可以用p  和  (*q);如果出于效率考虑可以用指针传递参数,如void fun(int[10] *p);  如果要怕影响原来的值就可以传递副本,如
void fun(int[10] a);  
    我觉得这样的设计也可以实现啊,而且还更自然,那么为什么当初C的实现不是这样的呢,我现在想知道的是什么原因使得他们按现在的标准实现。是考虑了那些因素。
回复 支持 反对

使用道具 举报

发表于 2006-5-19 19:25:09 | 显示全部楼层
Post by cxh_nuaa_2001
大家都知道在C/C++中数组是不能直接赋值的,要赋值必须一个一个的赋值。


#include <stdio.h>

int main()
{
        int a[10] = {2,3,4,5,6,7,8,7,6,5};
        return 0;
}

//不知道这算什么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-19 19:31:34 | 显示全部楼层
Post by 格子裙
#include <stdio.h>

int main()
{
        int a[10] = {2,3,4,5,6,7,8,7,6,5};
        return 0;
}

//不知道这算什么



这是初始化。
回复 支持 反对

使用道具 举报

发表于 2006-5-19 21:48:00 | 显示全部楼层
Post by cxh_nuaa_2001
如果按照我的设想,
int *(a[10]);  可以声明为  int*[10] a;
int (*b)[10];  可以声明为  int[10] *b;


如果你要强调效率,那么可以用指向数组(int (*a)[10];)的指针操作啊,直接赋值没有说不允许不使用指针啊。


如果楼主非要追求另一种语法格式, 我建议楼主去使用另外一种语言. 如果所有的语言都不能满足楼主的要求, 那么我那么楼主去尝试自己写一种语言, 然后让别人来使用.

关于效率, 仅靠指向数组的指针是远不够的. 如果楼主想要我举出例子, 我可以举, 不过通过一小段简单的代码想体现它的优势确实不会太明显, 而且也可能被人感觉是特意在绕圈.

P.S. 我想问一个问题, 为什么 Linuxsir.org 要起这个名字呢? 我感觉换一个会好一点
回复 支持 反对

使用道具 举报

发表于 2006-5-19 21:49:06 | 显示全部楼层
我想更多的是历史原因,为了兼容之前的代码。
回复 支持 反对

使用道具 举报

发表于 2006-5-20 19:59:52 | 显示全部楼层
我想楼主如果从头往后看的话可能会好理解些吧。
C /C++ 面向过程->基于对象->面向对象。
java 面向对象。
至于楼主说的数组是否应该当做一个基本类型来处理。我想这跟C的内存管理有关吧。
一个C/C++的基本数据数型都是有固定大小的吧,比如int是32位的。char, float .....
基于这样的一个设计思想,如果要把数组做为一个基本类型就麻烦了。难道要从int[1] -- int[2^32]分别定义基本类型吗?(因为它们所占的内存空间是不同的。)
回复 支持 反对

使用道具 举报

发表于 2006-5-20 20:08:11 | 显示全部楼层
本人初学,说的不对的地方请大家指正。
如果我没有理解错误的话,楼主是想将数组定义为像int , char , float等基本数据类型那样的。可以如此声明:int[20] a 一个20个元素的一维整数数组 a。
C中的基本数据类型最重要的一点我想是大家都有固定的长度(或都说在计算机存储中占用固定长度的位数)比如int型是32位的。基于这个设计思想,如果要将数组设计成一个基本数据类型的话可就麻烦了些,难道要设计一个从int[1] -- int[2^32] 这么多的基本类型?(因为它们各自所占的内存空间不同)
回复 支持 反对

使用道具 举报

发表于 2006-5-20 21:20:30 | 显示全部楼层
我想一方面这个是历史的原因;另一方面现在C++已经用class来解决了类似的需求,
如果要修改语言来实现这个“语法”并没有根本的好处,所以就保持原状了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表