07_指针运算,指针与一维数组
回顾:一维数组
// 定义且初始化数组
int arr[5] = { 1, 2, 3, 4, 5 };
// 遍历打印数组
for (int i = 0; i < 5; i++)
cout << arr[i] << "\t";
元素访问:通过 数组名+下标的形式
==> 能不能通过首地址+下标的形式访问数组元素?
// 定义int*类型指针p 保存arr首地址
int* p = arr;
// 通过指针(首地址)访问数组元素
for (int i = 0; i < 5; i++)
cout << p[i] << "\t";
// ==> p保存了首地址所以p和arr效果一样的
// 使用指针特性 取内容
for (int i = 0; i < 5; i++)
cout << *(p + i) << "\t";
// ==> p[i] 和 *(p + i) 是等价的
// ==> 指针可以进行运算
二 指针加减
注意:1 指针可以加上或减去一个整数
2 指针进行加减后,实际上是指针进行了偏移,偏移的范围是加上或减去的整数个单位。
单位大小:指针指向的类型在内存中所占的字节数
偏移:指针指向不变,但是根据偏移取别的内容
改变指向:指针指向变了(指针变量的值发生了改变)
存储模式
1 小端模式:低位存低字节(逻辑习惯)从高位向低位读取
2 大端模式:高位存低字节(阅读习惯)
// 小指针读取大内容 (读取部分)
int num = 0XABCD1234;
int* pn = #
short* p = (short*)pn;
printf("%X\n", *(p + 1));
// 大指针读取小内容 (读取多个)
short sh[5] = { 1, 5, 2, 3, 9 };
short* psh = sh;
int* p = (int*)psh;
printf("%X\n", *(p + 1));
三 自增自减(++ --)
指针自身,加一减一,所以指针本身发生了改变(改变了指向)
int arr[5] = { 1, 2, 3, 4, 5 };
int* p = &arr[0];
cout << " p:" << p << endl; // 地址1
cout << "*p:" << *p << endl; // 1
cout << endl;
p++;
cout << " p:" << p << endl; // 地址1+4
cout << "*p:" << *p << endl; // 2
cout << endl;
p++;
cout << " p:" << p << endl; // 地址1+4+4
cout << "*p:" << *p << endl; // 3
cout << endl;
short arr[5] = { 1, 2, 3, 4, 5 };
short* p = &arr[0];
cout << " p:" << p << endl; // 地址1
cout << "*p:" << *p << endl; // 1
cout << endl;
p++;
cout << " p:" << p << endl; // 地址1+2
cout << "*p:" << *p << endl; // 2
cout << endl;
p++;
cout << " p:" << p << endl; // 地址1+2+2
cout << "*p:" << *p << endl; // 3
cout << endl;
指针自增时,指向改变,
自增:指向向后改变一个单位
单位:指针指向的类型的字节数
同理可得:
指针自减时,指向改变
自减:指向向前改变一个单位
单位:指针指向的类型的字节数
short* pnull = NULL;
pnull--;
cout << pnull << endl; // FFFFFFFE
int* pnull = NULL;
pnull--;
cout << pnull << endl; // FFFFFFFC
综合练习
要特别注意运算时时指针相加减还是地址值相加减
int arr[5] = { 1, 2, 3, 4, 5 };
int* p = &arr[0];
int* p1 = p++;
cout << *(p1 + 2) << endl;
int** pp = &p;
int* p2 = (int*)((int)(*pp) + 4);
cout << *p2 << endl;