数组、指针 与 vector、迭代器
2012-12-30 22:09
176 查看
很多原因导致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
定义数组的长度必须用常量,如
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
相关文章推荐
- C++基本知识(二)——vector与迭代器和数组与指针
- C++基本知识(二)——vector与迭代器和数组与指针
- vector容器与迭代器,数组与指针
- vector与迭代器和数组与指针
- [转载]vector与迭代器和数组与指针
- 指针:指针是数组的迭代器
- 没有躲过的坑--vector使用erase后迭代器变成野指针
- 动态创建二维vector数组 C和C++ 及指针与引用的区别
- vector,迭代器,数组
- c++之Vector容器数据两种取值方法(指针访问,数组下标访问)
- 迭代器,数组和指针瞎扯扯
- C++学习笔记2:数组与容器,指针与迭代器
- 用string类型的vector对象创建一个字符指针数组
- [转]STL中vector转数组(实际是数组的指针)
- STL中vector转数组(实际是数组的指针)
- 动态创建二维vector数组 C和C++ 及指针与引用的区别
- Essential c++阅读笔记-第3章 数组和vector的find方法(哨兵指针)
- STL中vector转数组(实际是数组的指针)(zz)
- C++ 学习笔记(3)命名空间using、字符串、string、vector、迭代器、数组
- 与数组联合使用的指针---迭代器