Part one
在用到数组名的地方,便会将其转换为指向数组第一个元素的指针
char a[ ] = { };
auto p = a; //等价于 p = &a[0];
#include<iostream>
#include<string>
using namespace std;
void main() {
char a[4] = {'a','b','a','d'};
auto p = a;
auto q = &a[4]; //p为指向数组a的未元素的下一个地址的指针;
for (p; p != q; ++p)
cout << *p<< endl;
auto size_a = size(a);
cout << size_a << endl;
system("pause");
}
输出:
利用begin、end 函数避免手动确定数组起止地址指针可能会引发的错误;
#include<iostream>
#include<string>
using namespace std;
void main() {
char a[4] = { 'a','b','a','d' };
char *p = begin(a);
char *q = end(a); //p为指向数组a的未元素的下一个地址的指针;
for (p; p != q; ++p)
cout << *p << endl;
system("pause");
}
**Part two
给指针加上或者减去一个整数值,其结果仍然是指针。**新指针指向的元素与原来的指针相比前进(加)或后退(减)了该整数值个位置;
#include<iostream>
using namespace std;
void main() {
char a[4] = { 'a','b','a','d' };
char *p = a;
char *q = p + 3;
char *m = q - 2;
char *n = q - 6; //已超出数组范围
cout << "p = " << *p << endl;
cout << "q = " << *q << endl;
cout << "m = " << *m << endl;
cout << "n = " << *n << endl;
system("pause");
}
n为空。
Part three
两个指针相减,结果是他们之间的距离。
参与运算的两个指针必须指向同一个数组中的元素;
两个指针相减的结果是一种类型名为ptrdiff_t的标准库类型,因为两个指针相减差值可能为负,因此ptrdiff_t是一种带符号数。
#include<iostream>
using namespace std;
void main() {
char a[4] = { 'a','b','a','d' };
char *p = a;
char *q = &a[3];
auto len = q - p; //不确定是啥类型,用auto就好
auto length = p - q;;
cout << "p = " << *p << endl;
cout << "q = " << *q << endl;
cout << "len = " << len << endl;
cout << "length = " << length << endl;
system("pause");
}
Part four
下标和指针
#include<iostream>
using namespace std;
void main() {
char a[4] = { 'a','b','c','d' };
char *p = a; // p = &a[0];
char *q = &a[2];
char m = *(p + 2); // m == a[2] == *q == 'c';
char n = q[1]; // n == *(q+1) == a[3] == 'd';
char t = q[-1]; // t == *(q-1) == a[1] == 'b';
cout << "p = " << *p << endl;
cout << "q = " << *q << endl;
cout << "m = " << m << endl;
cout << "n = " << n << endl;
cout << "t = " << t << endl;
system("pause");
}