07_指针运算,指针与一维数组

一 指针与一维数组

回顾:一维数组

// 定义且初始化数组
int arr[5] = { 1, 2, 3, 4, 5 };
// 遍历打印数组
for (int i = 0; i < 5; i++)
cout << arr[i] << " ";

元素访问:通过 数组名+下标的形式

数组名是数组首地址

==> 能不能通过首地址+下标的形式访问数组元素?
// 定义int*类型指针p 保存arr首地址
int* p = arr;
// 通过指针(首地址)访问数组元素
for (int i = 0; i < 5; i++)
cout << p[i] << " ";
// ==> p保存了首地址所以p和arr效果一样的

// 使用指针特性 取内容
for (int i = 0; i < 5; i++)
cout << *(p + i) << " ";
// ==> p[i] 和 *(p + i) 是等价的
// ==> 指针可以进行运算

 

二 指针加减

注意:1 指针可以加上或减去一个整数

2 指针进行加减后,实际上是指针进行了偏移,偏移的范围是加上或减去的整数个单位。

单位大小:指针指向的类型在内存中所占的字节数
偏移:指针指向不变,但是根据偏移取别的内容
改变指向:指针指向变了(指针变量的值发生了改变)

存储模式

1 小端模式:低位存低字节(逻辑习惯)从高位向低位读取
2 大端模式:高位存低字节(阅读习惯)
    // 小指针读取大内容 (读取部分)
int num = 0XABCD1234;
int* pn = &num;
short* p = (short*)pn;
printf("%X ", *(p + 1));

// 大指针读取小内容 (读取多个)
short sh[5] = { 1, 5, 2, 3, 9 };
short* psh = sh;
int* p = (int*)psh;
printf("%X ", *(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;

 

 

原文地址:https://www.cnblogs.com/ZhenXin0101/p/13475233.html