一、指针的基本概念

指针的作用:可以通过指针间接访问内存。

  • 内存编号是从0开始记录的,一般用十六进制数字表示。
  • 可以利用指针变量保存地址。

二、指针变量的定义和使用

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

    int a = ;
//声明指针变量
int* p;
//指针指向a的地址
p = &a;
//利用*解引用,找到指针指向内存中的数据
cout << *p << endl;

三、指针所占内存空间

在32位操作系统下,无论指针数据类型是什么数据类型,都是占4个字节,而在64位操作系统中占8个字节。

四、空指针和野指针

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

用途:初始化指针变量。

注意:空指针指向的内存是不能够访问的。

int* p = NULL;
//*p;内存0-255之间的内存编号是系统占用的,不可以访问

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

//在程序中,避免出现野指针
int* p = (int*)0x1100;

五、const修饰指针

const修饰的指针有三种情况:

  • const修饰指针--常量指针
  • const修饰常量--指针常量
  • const修饰指针,又修饰常量
    int a = ;
int b = ;
//常量指针,指针指向的值不可以改,指针的指向可以改
//即*p=20是非法的,p=&b是合法的
const int* p = &a;
//指针常量,指针的指向不可以改,指向的值可以改
//即*p2=20是合法的,p2=&b是不合法的
int* const p2 = &a;
//指针指向的值和指向的值都不可更改
//即* p3 = 20是不合法的,p3 = &b是不合法的
const int* const p3 = &a;

六、指针配合数组使用

1.通过指针可以访问到数组中的值

int main() {
int arr[] = { ,,,,, };
//数组名就是数组的首个元素的地址
int* p = arr;
//利用指针访问数组中的第一个元素
//解引用取出4个字节中的数据
cout << *p << endl;
//因为p是一个整型指针,执行p++之后,指针指向的就是下一个元素
p++;
//利用指针访问数组中的第二个元素
cout << *p << endl;
}

2.通过指针来遍历数组

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

七、指针和函数

主要区别是值传递还是引用传递

1.值传递:改变形参的值不影响传递进来的实参

#include <iostream>
using namespace std; void swap(int num1, int num2) {
cout << "交换之前num1的值:" << num1 << endl;
cout << "交换之前num2的值:" << num2 << endl;
int tmp = num1;
num1 = num2;
num2 = tmp;
cout << "交换之后num1的值:" << num1 << endl;
cout << "交换之后num2的值:" << num2 << endl;
} int main()
{
int a = ;
int b = ;
cout << "实参未传入之前a的值:" << a << endl;
cout << "实参未传入之前b的值:" << b << endl;
swap(a, b);
cout << "实参传入之后a的值:" << a << endl;
cout << "实参传入之后b的值:" << b << endl;
system("pause");
return ;
}

输出:

2.引用传递:改变形参的值会影响到实参的值;

#include <iostream>
using namespace std; void swap(int* num1, int* num2) {
cout << "交换之前num1的值:" << *num1 << endl;
cout << "交换之前num2的值:" << *num2 << endl;
int tmp = *num1;
*num1 = *num2;
*num2 = tmp;
cout << "交换之后num1的值:" << *num1 << endl;
cout << "交换之后num2的值:" << *num2 << endl;
} int main()
{
int a = ;
int b = ;
int* p1 = &a;
int* p2 = &b;
cout << "实参未传入之前a的值:" << a << endl;
cout << "实参未传入之前b的值:" << b << endl;
swap(p1, p2);
cout << "实参传入之后a的值:" << a << endl;
cout << "实参传入之后b的值:" << b << endl;
system("pause");
return ;
}

输出:

 八、指针函数和数组

封装一个函数,利用指针对数组进行冒泡排序。

#include <iostream>
using namespace std; void bubbleSort(int* p,int length) {
//如果在这里计算数组的长度,输出为1,因为传入进来的是数组的首地址,里面只存放1个元素
//int len = sizeof(arr) / sizeof(arr[0]);
//cout << len << endl;
//arr是一个指针,指向数组的第一个元素,在数组中用下标访问元素的值时,相当于是将指针指向该元素的内存空间
//我的理解是c++会自己定位到那,并取得值
for (int i = length - ; i >= ; i--) {
for (int j = i - ; j >= ; j--) {
if (p[i] < p[j]){
int tmp = p[i];
p[i] = p[j];
p[j] = tmp;
}
}
}
}
void printArr(int* arr, int length) {
for (int i = ; i < length; i++) {
cout << arr[i] << endl;
}
} int main() {
int arr[] = { ,,,,,, };
//注意要在函数外先计算数组的长度
//如果在函数里面计算,由于数组传进去的是首元素的地址,则长度永远是1
int length = sizeof(arr) / sizeof(arr[]);
bubbleSort(arr, length);
printArr(arr, length); system("pause");
return ;
}

输出:

传入数组是引用传递,因此在里面改变了值会影响到原来数组arr的值,所以最后可以直接对arr进行打印输出。

最新文章

  1. 在Mac系统中安装及配置Apache Tomcat
  2. [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)
  3. ListView的使用-模拟微博随便看看栏目【执行与优化】
  4. eclipse项目导入androidstudio
  5. 使用sslsplit嗅探tls/ssl连接
  6. MSI安装程序在Win8/Win10及以上系统中DLL安装问题
  7. WCF入门(九)--WCF实例管理
  8. Swift中的注释以及表达式
  9. 认识CoreData-使用进阶
  10. ios中图片的绘画和截图
  11. libevent: linux安装libevent
  12. Js版游戏打砖块开发过程详细
  13. spark(1.1) mllib 源代码分析
  14. Java计算字符串中字母出现的次数
  15. 解决关于:Oracle数据库 插入数据中文乱码 显示问号???
  16. java的lamda表达式
  17. Spark编程指南分享
  18. 【原创】python 豆瓣采集
  19. WebRTC 学习之 WebRTC 简介
  20. 2721: [Violet 5]樱花|约数个数

热门文章

  1. python--debug神器pysnooper
  2. 关于Java运行机制
  3. Lab4\5:进程和线程
  4. python与redis交互及redis基本使用
  5. STM32F103C8T6 在VSCode下使用Platform IO开发,基于库函数V3.5版本
  6. python的Requests库的使用
  7. JavaScript---1.计算机的编程基础
  8. 【JavaEE】之SSM入门项目的搭建
  9. python初识-环境搭建,变量,条件,循环语句
  10. python20个骚操作