c++问题:改变数组大小

看代码:
#include<iostream.h>
#include<stdlib.h>
void main()
{
int n=5;//数组大小
int &nn=n;//用nn引用n

float *a=new float[n];
if(a==0){cout<<"loss"; exit(1);}
a[0]=3.1f;a[1]=3.2f;a[2]=3.3f;a[3]=3.4f;
float x;
cin>>x;
while(!x)
{
nn++;
cout<<sizeof(a)/sizeof(float);

cin>>x;
}
delete []a;
}
数组的大小结果总是1,1,1,1,1,1,1,我给它赋了4个值啊
其实我是想每输入一次x 数组的大小就增加一,可以的话,你们给个代码,多谢!!!

你的X的类型,是float型的,一般不能作为条件判断的语句

你的数组在while循环以前是在堆区分配的,而在while循环以内,你只是手动的增加了n的大小,并没有去增加数组空间的大小

而且最主要的a是指针类型的变量,指针在内存中一般占用四个字节,float也是占用四个字节,所以一直是1.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-10-30
你看看你打印的是什么,好伐 用模版类vector<T> ,T可以是任意数据类型,如你想用符点型就是vector<float> a,一开始是个空数组,如你想添加新数用成员函数push_back,如a.push_back(1),就是向数组中添加新成员1,如想丢弃元素用resize()函数,具体我忘了,你上网查查吧
第2个回答  2010-10-29
二楼说的对,sizeof是编译期间起作用的, 假如有 int a=sizeof(int);
如果在16位机器上编译,得到a为2; 直接放在32位机上运行(假定可以运行,不需移植),得到的还是2. 但如果将源码拿到32位机器上重编,运行后a为4。
这里的sizeof(a),a不是作为一个数组名使用的,而是作为一个指针的,sizeof(a)就是这个指针占用的内存的大小。a的长度和编译时用的那台机器的字长是一样的。
不理解也没关系,编译器就是这么做的,记住就行了。哈哈!
第3个回答  2010-11-11
cout<<sizeof(a)/sizeof(float);
你要记得,a不是真的一个数组,而是一个指针,sizeof(指针)永远等于机器指针长度(通常是机器字长,51单片机是我见过的唯一例外)。
sizeof()在C语言里只是一个符号,而不是一个真正的函数。所以sizeof(XXX)的值是在编译阶段确定的,不可能在运行时确定。
类似这样的郁闷事我也遇过,想在运行时确认指针指向的类大小,只好在基类定义虚函数size()然后在每个子类重载。一百个子类得写一百次,漏写一个都要出事……

用stl这种不能算答案的答案我就不写了,自己写个单链表,比较简陋,只是演示用,实际应用时建议还是使用STL。
//---------------------------------------------------------------------------
#include "iostream"
#include "stdlib.h"
#pragma hdrstop
using namespace std;

//---------------------------------------------------------------------------

template <class T>
class MyList
{
private:
struct TNode
{
T _MyVal;
TNode* Next;
};
TNode* Point2First;
unsigned __int16 Elements;
public:
MyList():Point2First(NULL),Elements(0){};
class iterator
{
protected:
TNode* _MyPtr;
public:
iterator():_MyPtr(NULL){};
iterator operator++()
{
if(_MyPtr!=NULL)
{
_MyPtr=_MyPtr->Next;
return *this;
}
else
{
return *this;
}
}
T &operator*()
{
return _MyPtr->_MyVal;
}
operator=(TNode* N)
{
_MyPtr=N;
}
bool operator==(void* P)
{
return _MyPtr==(TNode*)P;
}
bool operator!=(void* P)
{
return _MyPtr!=(TNode*)P;
}
};
iterator push_back(T E)
{
iterator R;
TNode *Node=Point2First,*LastNode=Point2First;
TNode *CN=new TNode;
CN->_MyVal=E;
R=CN;
while(Node!=NULL)
{
LastNode=Node;
Node=Node->Next;
}
if(LastNode!=NULL)
{
LastNode->Next=CN;
}
else
{
Point2First=CN;
}
Elements++;
return R;
}
TNode* begin()
{
return Point2First;
}
T& operator[](unsigned __int32 N)
{
TNode* Node=Point2First;
if(N<Elements)
{
for(;N>0;N--)
{
Node=Node->Next;
}
return Node->_MyVal;
}
else
{
throw(Node);
return Node->_MyVal;
}
}
unsigned __int32 Size()
{
return Elements;
}
};
#ifdef UNICODE
#define COUT wcout
#define CIN wcin
#else
#define COUT cout
#define CIN cin
#endif

int main(int argc, _TCHAR* argv[])
{
MyList<double> A;
double Input;
signed __int32 l;
do
{
CIN>>Input;
A.push_back(Input);
}while(Input!=0.0);

for(l=0;l<A.Size();l++)
{
COUT<<A[l]<<'\t';
}
/*
MyList<double>::iterator PT;
PT=A.begin();
while(PT!=NULL)
{
cout<<(*PT)<<'\t';
PT++;
}*/ //这个同样可以显示
COUT<<endl<<"Elements: "<<A.Size()<<endl;
system("pause");
return 0;
}
//---------------------------------------------------------------------------
相似回答