长安的花

当学问走过漫漫古道
凿刻入千窟,心也从愚昧中苏醒

0%

c++学习07-指针与数组

指针和数组

数组拥有很多个地址,每个地址对应着一个元素。

数组的名字其实也是一个指针(指向数组的基地址,就是第一个元素的地址)

例子

以下两句做同样的事情:

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;
}
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道