很多原因导致C++提供的新特性不受‘待见’,比如人们还是喜欢用scanf、printf而不是cin、cout,喜欢用字符数组而不是string,喜欢用fopen而不是iostream。数组和指针概念也深入人心,vector和迭代器体现了C++的优越性,然而并不多见于普通程序中。此文深入讨论这4种数据结构的概念和使用。
定义数组的长度必须用常量,如
int n[10];
或:
int s=3;
int n[s]={1,2,3};
没有任何可以检测数组长度的函数=也没有自动添加元素的函数(VB中的UBound()和ReDim在C中是不存在的)。strlen()常用于取得字符数组的长度,但要注意是第一个\0字符前的长度。strlen()的宽字符版本是wcslen()。
在函数体外定义的数组,元素值初始化为0,在函数体内定义的,则无自动初始化,在使用之前,应该自己初始化,否则自增等操作将出现错误结果。字符数组可以用一个字符串来初始化,但会自动加上一个\0字符作结尾,如:
char sz[]="abcd";
上述sz数组中,包含了5个元素:a,b,c,d和\0。这样的写法sz[4]="abcd";是错误的。
每个指针都有与之关联的数据类型,如果类型兼容或实际相同,指针可以强制转换,void*便是这种“通航型指针”,常见于函数参数、返回值等传递。例如常见的 (LPSTR)lParanm,将其指针型参数强转为字符类型。未初始化的指针指向未知地址,应避免使用。给指针p赋值可以更改其指向目标,给*p赋值则是改变目标的值。如:
int m=2, n=3;
int* p=&m; //p指向m,*p为2
p=&n; //p指向n,*p为3