C++编程入门 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

指针

据说指针是C++语言中很难的一部分,通过本节课的学习,你会发现指针一点也不难。何谓指针:它就是一种数据类型,指针变量里面存储的值是内存地址

int类型的变量存放的是整数,而指针类型的变量存放的是内存地址的值。根据该地址的值,可以找到某块内存,从而读取出该内存中存储的变量值。也可以形象的说指针变量指向某块内存,或者指向某个变量。这也就是之所以叫指针变量的原因。

指针也有多种类型,由它所指向的变量的类型而定。例如,一个指针指向int型变量,那么该指针就是int型指针。不同类型的指针变量所占内存的大小都是相同的,因为都是用来存放内存地址的。

定义及初始化

注意要指明指针的类型。格式为:数据类型 *指针变量名1,*指针变量名2,...,*指针变量名n;指针变量与一般变量一样,在定义时可以初始化,也可以不赋初值,等用到的时候再进行赋值,只是所赋的值为内存地址的值。一般变量、数组元素等地址值都可以在名称前加取地址运算符'&'获取。例如

int i,a[10];
int *p=&i;
double \*k;
int *p1;
p1=&a[1];

指向的变量

C++用*p来表示指针p指向的变量,这里是'*'是取内容运算符,作用是表示该指针所指向的变量的内容。简单理解,p是指针变量,里面存的是内存地址。'*'是取内容运算符,所以两者合起来'*p'就是获取某个内容地址存储的内容,也就是说获取所指向变量的内容。上例中'*p'等价于变量a。

指针运算

1.给指针所赋的值应该是它所指向类型变量的地址值。例如,int型指针变量只能接收int型变量的地址,而不能是double变量的地址,更不能是一个整数。

2.已声明的指针变量,没有给其赋一个内存地址值之前,是绝对不能使用的

#include <iostream>
using namespace std;
int main()
{
    char s[11]="abcdefg";
    char *p;
    p=s;
    while(*p != '\0')
        p++;
    int n=p-s;
    for(p=s+n-1;p+1!=s;p--)
        cout<<*p;
    cout<<endl;
    return 0;
}

这段代码看着很复杂,其实解释开来就简单了,且看下面的解析

第5行第6行分别声明了字符数组s和字符指针p。第7行执行结束后,p指向数组s的头部也就是s[0]。数组名代表数组第一个元素的内存地址:s等价于&s[0]

第8行和第9行是while循环。第9行是循环体,只有一条语句,所以省略循环体外面的大括号。循环条件中出现了'*p',表示p指向的内存中存储的值。第一次判断时*p=s[0]='a',满足条件进入循环体。循环体中出现p++:这里不能理解为数值加1,而是加一个数据类型所占的字节数。p是字符指针,所以要加的是一个字符所占内存的字节数,也就是一个字节。第9行执行一次结束后,*p=s[1]='b'。循环继续进行,直至p指向字符数组的s[7]='\0'时,循环条件不满足,跳出循环。

第10行执行后,n就是字符串实际占据内存的字节数7:p现在指向s[7]的内存地址,s代表是s[0]的内存地址,这中间共有7个字节,用于存放“abcdefg”。

第11行与第12行是for循环。初始条件p=s+n-1执行后,p指向s[6],满足条件p+1!=s,打印'g',然后p--后p指向s[5]。循环一直进行,直到p指向s[0]前面一个字节的内存,不满足条件p+1!=s,跳出循环。

以上程序输出结果为:gfedcba

在右侧代码框中编写程序:用指针来获取并打印用户输入的字符串中ASCII码值最大的字符。