C/C++高级训练之指针基础操作
这一节课呢讲一讲指针的基本操作,包括,指针的加减运算,指针的运算及指针的强制类型转换。
指针与整数的加减运算
#include <iostream>
#include <string>
using namespace std;
int main(void){
//我们用代码来讲解
//首先我们先定义一个字符串数组
string meritList[] = {"玩游戏","撸代码","泡妹子","Q群开车","打豆豆"};
//我们这里定义了一个长度为5的字符串数组,我们现在来看看用指针应该怎么访问这些数据
//1.首先定义一个字符串指针然后将字符串数组的地址赋给它
string *pStr = meritList;
//2.那么根据上节课的知识我们要想访问里面的数据就要像数组一样访问那么该怎么办呢?很简单就是指针的读操作
//*pStr 这样就读到了指针内存的数组数据,然后我们打印一下看看是什么。
cout << *pStr << endl;
}
结果就是 “玩游戏”
哎,这时候我们就有疑问了,为什么是玩游戏呢?为什么不是整个数组,又或者为什么不是撸代码呢?
那么根据这上面代码我们就知道当我们把数组赋值给指针的时候实质上是把数组的首元素地址赋值给了指针,即数组首元素地址就等于数组地址
那么问题来了,我们难道只能拿到一个数据后面的数据不能拿到么?肯定是可以的啊,这里就要牵扯到指针的加减运算了。
首先我们要了解的是,数组的在内存中的分配原理,当我们定义一个数组的时候我们必须对其进行赋值或者指定数组的长度,为什么呢?因为定义数组时cpu会在内存为我们分配一段连续的固定的内存空间用来存放数组的数据,这也就是为什么我们在传数组作为数据的时候必须传长度。
那我们就来看看我们定义的数组实际在内存中的存储情况
那么知道了内存连续的,又得到了首地址,那么怎么才能拿到后面的数据呢?很简单,首地址内存+1是不是就拿到后一个数据了呢?我们来试试
//首地址是pStr,往后加一个就是pStr+1,然后再执行读操作即*(pStr+1)
cout << "第二个元素的值为:" << *(pStr+1) << endl;
结果为:
我们看到第二个元素就已经拿出来了,这就是指针的加运算,减运算也一样
//我们先将最后一个元素的地址赋值给一个新指针,然后再执行减操作
string *pStr5 = &meritList[4];
cout << "第五个元素的前一个元素的值为:" << *(pStr5-1) << endl;
结果如下:
可以看到将第五个元素的内存地址减去一位然后再执行读操作即可读出第四个元素的值
不同类型的指针,步长不一样,所以在做加减运算的时候要注意!
每一步的大小:sizeof(数据类型)
指针的比较运算
指针也是同其他变量一样可以进行比较的哦,
例如 pStr4 小于 pStr5
string* pStr4 = &meritList[3];
if (pStr4 < pStr5) {
cout << " pStr4比pStr5小哦!" << endl;
}
温馨提示:
指针的自增和自减实际上是改变了指针的指向的位置,p++ 和 *(p+1)要理解清楚!
指针的强制类型转换
指针也跟其他变量一样可以进行强制类型转换,比如将一个整型指针转换成一个字符型指针
printf("--------------------------------------------------------------------------------\n\n");
int x = 0x31323334;
char* p = (char*)&x;
for (int i = 0; i < 4; i++) {
printf("%c", *p);
p++;
}
这一课就到这里,下节课讲解指针与数组的不解之缘!