c++基础入门自学笔记总结2---C++入门(下)

今天,我们就来进行指针的知识总结。

说句题外话,这部分可以说是c和c++重要基础,在初次接触时也感觉有点难度,即使在学后几天了对指针的运用还不是很熟练,但也不必太着急,毕竟学东西总要讲究先来后到,一步一步慢慢来,才能扎扎实实,学到真东西。

指针

作用:可以通过指针间接访问内存
1.内存编号是从0开始记录的,一般用十六进制数字表示(可以利用int转化为十进制)
2.可以利用指针变量保存地址
可以通过指针来保存一个地址

指针变量的定义和使用

指针变量定义语法数据类型 * 变量名;

例:int*p;//相当于创建了一个指针p

让指针记录变量a的地址
例:p=&a;//在变量a前加上“&”可以表示a变量的地址,再让指针p指向a的地址

使用指针
可以通过解引用的方式来找到指针指向的内存
指针前加*代表解引用找到指针指向的内存中的数据
例:*p  //可以理解为p指针指向了变量a的地址,然后用“*”对指针p进行解引用,即获取指针指向地址所在的数据a

指针变量和普通变量的区别

1.普通变量存放的是数据,指针变量存放的是地址

2.指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用

下面我们就通过vs来理解一下上面的内容

 通过上面的运行结果就可以明显看到变量a输出了一个数据,而指针则输出了一个地址

 

 通过上面的运行结果可以看到指针p解引用后得到了指向地址处的数据

好,到这里我们可以简单做个小结:

总结1: 我们可以通过 & 符号 获取变量的地址

总结2:利用指针可以记录地址

总结3:对指针变量解引用,可以操作指针指向的内存

指针所占内存空间

 指针也是种数据类型,那么我们来看一下这种数据类型要占用多少内存空间

我们先选择64位操作系统

  结果如下

  可以看到在64位操作系统下指针p占用的内存空间为8个字节

然后换用32为操作系统来看一下有什么不同

 结果如下

  可以看到在32位操作系统下,指针p所占用的内存空间发生了变化为4个字节。

其他数据类型的指针同理如下

32为操作系统:

 64位操作系统:

 

 

 

空指针和野指针

空指针:指针变量指向内存中编号为0的空间

用途:初始化指针变量

例:int*p=NULL

我们可以尝试对空指针的指向进行访问

结果如下:

 

 

 直接报错了。。。

说明了空指针指向的内存是不可以访问的//因为内存编号0 ~255为系统占用内存,不允许用户访问

野指针:指针变量指向非法的内存空间

野指针也很好理解,就指向了在可访问的空间之外的指针

如我们随便让一个指针指向一个地址

 

 //地址要用十六进制的格式

然后结果如下:

 

 直接报错了

//在程序中尽量避免出现野指针
总结:空指针和野指针都不是我们申请的空间,因此不要访问

const修饰指针
1.const修饰指针——常量指针
int a=10;
int b=10;
int*p=&a;
const修饰指针表示
const int*p=&a;
常量指针特点:
指针的指向可以修改,但是指针指向的值不可以改
例:*p=20;      错误:指针指向的不可以
        p=&b;      正确:指针指向可以修改

2.const指针常量
int*const p=&a;
特点:指针指向不可以改,指针指向的值可以改
例:*p=20;       正确:指针指向的可以
        p=&b;       错误:指针指向不可以

3.const int*const p=&a;

特点:指针的指向和指针指向的值都不可以

 例:*p=20;      错误
         p=&a;      错误

//技巧:看const右侧紧跟着的是指针还是常量,是指针就是常量指针,是常量就是指针常量

 

指针和数组

作用:利用指针访问数组中元素

例:

int arr[5]={1,2,3,4,5};

cout<<arr[0]<<endl;
int*p=arr;//arr就是数组的首地址
cout<<*p<<endl;//解引用后读取数组第一个元素
p++;//让指针向后偏移4个字节,即读取后一个元素

利用指针遍历数组
int*p2=arr;
for(int i=0;i<5;i++)
{
//cout<<arr[i]<<endl;
cout<<*p2<<endl;
}

指针和函数

作用:利用指针作函数参数,可以修改实参的值

参数传递方法:
1.值传递

void swap1(int a ,int b)
{
int temp = a;
a = b;
b = temp;
}


2.地址传递

void swap2(int * p1, int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}

我们可以比较两种参数传递的方式,通过前面的学习其实我们已经知道了值传递并不会改变实参

 

 

 但是地址传递呢?

我们来运行看一下

 

 

 两次结果的对比就很明显了,即值传递不改变实参,而地址传递可以改变实参。

也可以参考我画的示意图进行理解

 

 案例练习:

案例描述:封装一个函数,利用冒泡排序,实现对整型数组的升序排序

例如数组:int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };

实现思路:

先写冒泡排序函数,然后写结果输出函数,最后在main函数中输入数据,还可以根据结果进行调整使最终输出结果更加美观。

 代码如下:

 

 运行结果如下:

 

 总结:当数组名传入到函数作为参数时,被退化为指向首元素的指针

指针这一块的总结真不容易做,笔者也是从早上吃完饭后就会宿舍马不停蹄的敲,到中午才结束,但是麻烦归麻烦,做自学打卡还是大有裨益的,不仅能让我坚持学习,不会让将来的自己悔恨自己的碌碌无为,而且也让我能够及时得回过头来再仔细检查一下自己到底学到了什么,可能有些概念忘记了,没关系,拾起来,可能有些概念当时学的时候并没有理解的那么深刻,没关系,那就再来理解一遍,总有学成的那一天(我相信)

 

 

 

posted @ 2022-09-18 13:25  书文阁下  阅读(65)  评论(0编辑  收藏  举报