c++基础入门day7 - 指针
2026/7/19 13:29:59 网站建设 项目流程

c++基础入门day7

工具:vs2026
课程:【黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难】

7 指针

7.1 指针的基本概念

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

7.2 指针变量的定义和使用

  1. 指针变量定义语法:数据类型 * 变量名
  2. 指针变量的使用:*p
    通过解引用的方式找到指针指向的内存中的数据
  3. 程序示例:
#include<iostream>usingnamespacestd;intmain(){inta=10;// 1. 定义指针// 指针定义语法:数据类型 * 指针变量名int*p;// 让指针记录变量a的地址p=&a;cout<<"a的地址为:"<<&a<<endl;cout<<"指针p为:"<<p<<endl;// 2. 使用指针// 可以通过解引用的方式来找到指针指向的内存中的数据// 指针前加 * 代表解引用*p=1000;cout<<"a = "<<a<<endl;cout<<"*p = "<<*p<<endl;system("pause");return0;}

7.3 指针所占内存空间

  1. 在32位操作系统中,占4字节
  2. 在64位操作系统中,占8字节
  3. 与数据类型无关
  4. 程序示例:
#include<iostream>usingnamespacestd;intmain(){// 指针所占内存空间inta=10;int*p=&a;cout<<"sizeof(int *) = "<<sizeof(int*)<<endl;cout<<"sizeof(float *) = "<<sizeof(float*)<<endl;cout<<"sizeof(double *) = "<<sizeof(double*)<<endl;cout<<"sizeof(char *) = "<<sizeof(char*)<<endl;system("pause");return0;}

7.4 空指针和野指针

  1. 空指针:指针变量指向内存中编号位0的空间
  2. 空指针用途:初始化指针变量
  3. 空指针指向的内存是不可以访问的
  4. 空指针程序示例:
#include<iostream>usingnamespacestd;intmain(){// 空指针// 空指针用于初始化指针变量int*p=NULL;// NULL即0// 空指针是不可以进行访问的// 0~255之间的内存编号是系统占用的,不可以被访问system("pause");return0;}
  1. 野指针:指针变量指向非法的内存空间,是一种错误
  2. 野指针程序示例(异常):
#include<iostream>usingnamespacestd;intmain(){// 野指针// 随意定义一个没有申请的内存是不可以的int*p=(int*)0x1100;// 0x1100是一个十六进制数,(int*)转为十进制地址// 引发了异常: 读取访问权限冲突。cout<<*p<<endl;system("pause");return0;}
  1. 空指针和野指针都不是我们申请的空间,因此不可以被访问。

7.5 const修饰指针

  1. const修饰指针:常量指针
    const int* p = & a;
    (1)指针的指向可以修改
    (2)指针指向的值不可以改
  2. const修饰常量:指针常量
    int* const p = & a;
    (1)指针的指向不可以修改
    (2)指针指向的值可以修改
  3. const既修饰指针,又修饰常量
    const int* const p = & a;
    (1)指针的指向和指针指向的值都不可以改
  4. 程序示例:
#include<iostream>usingnamespacestd;intmain(){inta=10;intb=10;// 1. const修饰指针:常量指针constint*p1=&a;// 指针的指向可以修改;指针指向的值不可以改p1=&b;// 2. const修饰常量:指针常量int*constp2=&a;// 指针的指向不可以修改;指针指向的值可以修改*p2=20;// 3. const既修饰指针,又修饰常量constint*constp=&a;// 指针的指向和指针指向的值都不可以改system("pause");return0;}

7.6 指针和数组

  1. 作用:利用指针访问数组中的元素
  2. 复习:数组名可以用于获取数组在内存中的首地址
  3. 程序示例:
#include<iostream>usingnamespacestd;intmain(){// 指针和数组// 利用指针访问数组中的元素intarr[10]={0,1,2,3,4,5,6,7,8,9};cout<<"第一个元素为:"<<arr[0]<<endl;int*p=arr;//复习:数组名可以用于获取数组在内存中的首地址cout<<"利用指针访问第一个元素为:"<<*p<<endl;p++;//让指针向后偏移4个字节(int)cout<<"利用指针访问第二个元素为:"<<*p<<endl;int*p2=arr;cout<<"利用指针遍历数组:"<<endl;for(inti=0;i<10;i++){cout<<*p2<<endl;p2++;}system("pause");return0;}

7.7 指针和函数

  1. 作用:利用指针作为函数参数,可以修改实参的值
  2. 复习:值传递不会改变实参的值
  3. 程序示例:
#include<iostream>usingnamespacestd;// 实现两个数字进行交换voidswap01(inta,intb){inttemp=a;a=b;b=temp;cout<<"swap01 a = "<<a<<endl;cout<<"swap01 b = "<<b<<endl;}voidswap02(int*p1,int*p2){inttemp=*p1;*p1=*p2;*p2=temp;}intmain(){// 指针和函数// 1. 值传递inta=10;intb=20;swap01(a,b);cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;// 2. 地址传递// 地址传递可以修改实参的值swap02(&a,&b);cout<<"swap02 a = "<<a<<endl;cout<<"swap02 b = "<<b<<endl;system("pause");return0;}

7.8 指针、数组、函数

  1. 案例描述:

封装一个函数,利用冒泡排序,实现对整型数组的升序排序
例如数组:int arr[10] = {4,3,6,9,12,10,8,7,5};

#include<iostream>usingnamespacestd;// 封装一个冒泡函数,实现对整型数组的升序排序voidBubbleSort(int*arr,intlen){for(intj=0;j<len-1;j++){for(intk=0;k<len-j-1;k++){if(arr[k]>arr[k+1]){inttemp=arr[k];arr[k]=arr[k+1];arr[k+1]=temp;}}}}// 封装打印数组的函数voidprintArray(int*arr,intlen){for(inti=0;i<len;i++){cout<<arr[i]<<" ";}cout<<endl;}intmain(){intarr[10]={4,3,6,9,1,2,10,8,7,5};cout<<"排序前数组元素为:"<<endl;printArray(arr,sizeof(arr)/sizeof(arr[0]));BubbleSort(arr,sizeof(arr)/sizeof(arr[0]));cout<<"排序后数组元素为:"<<endl;printArray(arr,sizeof(arr)/sizeof(arr[0]));system("pause");return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询