指针和数组
数组拥有很多个地址,每个地址对应着一个元素。
数组的名字其实也是一个指针(指向数组的基地址,就是第一个元素的地址)
例子
以下两句做同样的事情:
1 2
| int *ptr1 = &myArray[0]; int *ptr2 = myArray;
|
通过指针访问其他数组元素
ptr1++;
指针运算的奇妙之处就在于,以上并不将地址值简单+1处理,它是按照指向的数组的数据类型来递增的,也就是 +sizeof(int)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include <iostream>
int main() { const unsigned short ITEMS = 5; int intArray[ITEMS] = {1, 2, 3, 4, 5}; char charArray[ITEMS] = {'F', 'i', 's', 'h', 'C'}; int *intPtr = intArray; char *charPtr = charArray; std::cout << "整型数组输出: " << '\n'; for( int i=0; i < ITEMS; i++ ) { std::cout << *intPtr << " at " << reinterpret_cast<unsigned long long> (intPtr) << '\n'; intPtr++; } std::cout << "字符型数组输出: " << '\n'; for( int i=0; i < ITEMS; i++ ) { std::cout << *charPtr << " at " << reinterpret_cast<unsigned long long> (charPtr) << '\n';//这里用windows,long是4位 charPtr++; } return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12
| 整型数组输出: 1 at 6422000 2 at 6422004 3 at 6422008 4 at 6422012 5 at 6422016 字符型数组输出: F at 6421995 i at 6421996 s at 6421997 h at 6421998 C at 6421999
|
reinterpret_cast<unsigned long long>
强制转化为地址
应用
重载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <iostream>
void print( int *pBegin, int *pEnd ) { while( pBegin != pEnd ) { std::cout << *pBegin; ++pBegin; } }
void print( char *pBegin, char *pEnd ) { while( pBegin != pEnd ) { std::cout << *pBegin; ++pBegin; } }
int main() { int num[5] = { 0, 1, 2, 3, 4 }; char name[5] = { 'F', 'i', 's', 'h', 'C' }; print( num, num+5 ); std::cout << '\n'; print( name, name+5 ); std::cout << '\n'; return 0; }
|
但是这样每次都需要写void函数,去修改输入参数的类型,所以接下来介绍泛型程序设计
泛型程序设计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <iostream>
template <typename elemType> void print( elemType *pBegin, elemType *pEnd ) { while( pBegin != pEnd ) { std::cout << *pBegin; ++pBegin; } }
int main() { int num[5] = { 0, 1, 2, 3, 4 }; char name[5] = { 'F', 'i', 's', 'h', 'C' }; print( num, num+5 ); std::cout << '\n'; print( name, name+5 ); std::cout << '\n'; return 0; }
|