SEU C++下半部分总结 第七章

指针

通俗的理解,学校可以轻松的通过学生的学号找到学生,计算机也采取了类似方式来快速寻找内存中的数据,计算机给每片内存编号(地址),地址其实就是一个long型整数,而指针变量其实就是保存了这个long型整数。

int a = 4;
int* p;//定义一个整型指针
p = &a;//变量p中存储了系统给a分配的这块内存的编号

通过指针,可以改变这片内存中存储的内容

*p = 5;
cout<<a;

结果: 5

指针变量在C++中有广泛的应用,例如,在函数中改变实参的值就要用到指针,对数组和字符串的操作也要大量用到指针。

多级指针

int **a;

以上代码定义了一个二重指针,我们说过,指针变量中实际储存着一个long型整数,那么第二级指针里存放的就是这个long型整数的地址。
(多重指针理解起来比较复杂,考试应该也不会涉及太多)

指针与数组

指针与一维数组

int a[5]{0,1,2,3,4};
    int *p;
    p = a;
    for (int i = 0; i < 5; ++i) {
        cout<<p[i];
    }

在以上操作中,p=a就是把数组元素的首地址赋值给了指针变量p,有了数组的首地址就可以使用[]运算符对数组进行操作(可以把数组理解为指针常量)。
理解了这一点,指针和数组的关系就非常简单了。
指针是可以进行算数运算的,以上面的p为例,p++这个表达式会让指针指向下一个int型数。系统会根据指针变量的类型自动计算偏移量,不需要我们操心。

指针与二维数组

二维数组可以认为是一个二重指针。但是不能直接用[][]方式访问
用指针访问一个二维数组有以下几种方式:
有一个数组a[5][5]想要访问a[i][j]:

int *p = a[0];//p = *a;
p[i*5+j];
*((p+i)+j);
(p+i)[j];

指向数组的指针和指针数组

这部分最重要的是要知道*运算的优先级低于[]运算
要分清下面两种情况
int * a[10];
由于[]优先级高,所以先处理a[10],所以这是一个数组,数组里的元素类型是整型指针型
(int *) a[10];
先处理括号内的运算,int * a,所以a是一个指针,指向一个有10个元素的数组。

指针与函数

往函数里传入指针

传入指针变量的方式与传入其他类型的变量没有区别。注意以下情况即可。

void swap(int *p1,int *p2);

int a,b;
swap(&a,&b);

函数指针

这部分很复杂,在实际操作中可以为程序增加弹性,但考试涉及到应该不会很难,只要会分辨下面的情况:
int *fun();
这是一个返回值为整型指针的函数。
int ( * f)(int )
这是一个指向返回值为int,参数为一个int的函数的指针。

特殊指针

void *表示这个指针还没有明确的类型,可以通过转型转化为任意一种类型。

const* 指针表示这个指针的指向的地址不能修改,但是地址指向的内存里的内容可以修改(这里涉及到一些顶层const和底层const的理论,考试应该不会重点考察)。

指针与字符串

字符串的本质是一个char数组,比如一个string “abc”
它其实就是一个char数组{‘a’,‘b’,‘c’,’\0’};这个数组以\0作为结束符,所以用指针操作字符串实质上就是用指针操作一个数组。

引用

引用是C++特有的一种元素。可以理解是给变量起了一个别名

int a = 6;
int &b = a;
b=5;
cout<<a;

结果:
5

对引用的操作实际上就是对原数据的操作。在一般情况下,用指针或引用传递参数差别不大。但在传递规模较大的数据时,我们出于性能考虑会使用引用传递参数而不是指针。

内存的动态分配

在分配内存是,一般要使用new关键字,使用new关键字有较为固定的格式:

int *a = (int*) new int(100);

new关键字返回的是void*型指针,所以要将其转型为需要的类型。

在删除内存时,用到delete关键字。
当删除指针对应的内容时:

delete a;

当要删除数组的所有元素时:

int k[10];
delete [] k;

链表

链表是一种数据结构。
我们最熟悉的数据结构就是数组,数组是一段连续的内存,而链表的内存是不连续的。
数组的随机访问效率高,链表的增删效率比较高。

Alt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值