C++基础教程12-指针

文章目录

  • 1.指针的概述
  • 2.指针的定义和使用
  • 3.用图形理解指针
  • 4.指针所占的内存空间
  • 5.空指针
  • 6.野指针
  • 7.使用const修饰
  • 8.指针和数组
  • 9.指针和函数
  • 10.指针、数组、函数的综合案例
  • 篇章

1.指针的概述

指针的作用:可以间接访问内存地址。可以利用指针变量保存地址。

内存地址的编号:地址是十六进制组成,所以内存地址编号中的数字或字母都是从0-F中选择的。

在十六进制中,是不能出现16的,也就是字母G。

十六进制的一位数表示方式和范围:0,1,2,3,4,5,6,7,8,9

十六进制的两位数表示方式和范围:A=10, B=11, C=12, D=13, E=14 ,F=15

2.指针的定义和使用

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

指针变量记录变量地址的语法:指针变量=& 变量;

两种语法合体:数据类型 * 指针变量=& 变量;

#include
using namespace std;
int main()
{
     
    int a = 10;//定义一个整型变量a
   
    //1.定义一个指针
    int* p; //point是指针的意思,所以我用了首字母p 
    p = &a;//让指针p记录变量a的地址,用and符连接
    cout << "指针p为:" << p << endl;//得出的结果是一个十六进制的数

    //2.使用指针
    //可以通过解决引用的方式来找到指针指向的内存,通过间接访问,可以完成读和写的操作
    *p = 100;//指针前面加一个星号,叫做解引用,可以找到指针指向的内存中的数据
    cout << "a=" << a << endl;
    cout << "*p=" << *p << endl;
    return 0;
}

int * p;p=&a;也可以写成int *p=&a;

运行效果
C++基础教程12-指针_第1张图片

3.用图形理解指针

指针变量名p与整型变量a建立关系,用图像理解
C++基础教程12-指针_第2张图片
结论:指针也是一种数据类型,也占内存空间。

4.指针所占的内存空间

用sizeof()的方法来查询指针内存。

#include
using namespace std;
int main()
{
     
	int a = 10;
	int* p = &a;//定义指针变量,再用指针变量记录变量a
	cout << "int * p=" << p  << endl; //得到的结果为十六进制
	cout << "sizeof int * p=" << sizeof(p) << endl; //指针变量所占内存为4

	cout << "浮点类型所占内存为" << sizeof(float *); //输出浮点类型的指针内存
}

运行效果
C++基础教程12-指针_第3张图片

5.空指针

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

空指针的用途:指针变量的初始化。相当于给指针变量划分了一个空的内存空间。

C++基础教程12-指针_第4张图片

注意事项:空指针的内存是不可以访问的。

#include
using namespace std;
int main()
{
     
    int* p = NULL; //指向一个地址为0的内存编号
    
    cout << *p << endl;    //访问指针出现错误
    //因为内存编号0-255为系统占用内存,不允许用户访问
    return 0;
}

结果会出现一个!
C++基础教程12-指针_第5张图片
翻译过来是:取消对空指针“p”的引用。

用自己的话来说,我们是不能对空指针进行访问的。

6.野指针

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

用自己的话来说,相当于做了比较过分的事情。

从下面的代码可以看出,编号是自己写的,没有用正确的编号。
这样的写法,很容易给程序带来不必要的异常。

#include
using namespace std;
int main()
{
     
    int * p = (int*)0x0100;//指针变量p指向内存地址编号为0x0100

    cout << * p << endl;//访问野指针,和空指针一样不能被访问

    return 0;
}

7.使用const修饰

int a=10; // 高级解释:创建一个内存空间。

①const修饰常量

#include
using namespace std;
int main()
{
     
    int a = 10;
    const int* p = &a;

    return 0;
}

结论:指针指向的值不可以改,指针的指向是可以改的。

②const修饰指针

#include
using namespace std;
int main()
{
     
    int a = 10;
    int * const p  = &a;
    
    return 0;
}

结论:指针指向的值可以改,指针的指向是不可以改的。

③const既修饰指针,又修饰常量

#include
using namespace std;
int main()
{
     
    int a = 10;
    const int * const p  = &a;

    return 0;
}

结论:指针指向的值不可以改,指针的指向也不可以改的。

8.指针和数组

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

#include
using namespace std;
int main()
{
     
    int arr[] = {
      1,2,3,4 };//创建一个数组
    int * p = arr;//指向指针数组

    cout << "第一个元素:" << arr[0] << endl;
    cout << "指针访问的第一个元素:" << *p << endl;
    
    for (int i=0;i<4;i++)
    {
     
        cout << *p << endl;//利用指针遍历数组
		//变量指针指向的是1,所以没了p++,四次的遍历都会指向1

        p++;//指针向后偏移
        //指针变量需要不断地加1,如果不加,就只能遍历到数组中的第一个元素。
    }

    return 0;
}

运行效果
C++基础教程12-指针_第6张图片

9.指针和函数

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


值传递(函数参数传值):不能修改实参的值。

#include
using namespace std;

//值传递:无法修改实参的值,所以没有交换成功
void  swap1(int a, int b)
{
     
    int temp = a;
    a = b;
    b = temp;
}
int main()
{
     
    int a = 10;
    int b = 20;
    cout << "原来的数:";
    cout << "a=" << a << "\t";
    cout << "b=" << b << endl;

    swap1(a, b);
    cout << "交换后的数:";
    cout << "a=" << a << "\t";
    cout << "b=" << b << endl;

    return 0;
}

运行效果
C++基础教程12-指针_第7张图片


地址传递(利用指针的方法):可以修改实参的值

#include
using namespace std;

//值传递
void  swap1(int *a,int *b)
{
     
    int temp = *a;
    *a = *b;
    *b = temp;
}
int main()
{
     
    int a = 10;
    int b = 20;
    cout << "原来的数:";
    cout << "a=" << a << "\t";
    cout << "b=" << b << endl;

    swap1(&a, &b);//地址传递,修饰实参
    cout << "交换后的数:";
    cout << "a=" << a << "\t";
    cout << "b=" << b << endl;

    return 0;
}

运行效果
C++基础教程12-指针_第8张图片

10.指针、数组、函数的综合案例

#include
using namespace std;

//最大值函数
void  Max(int * arr, int len)//参数首地址,数组的长度
{
     
    int max = 0;
    for (int i=0;i<len;i++)
    {
     
       
        if (arr[i]>max)
        {
     
            max = arr[i];
        }
    }
    cout << "最大值:" << max << endl;
}

//打印数组的函数
void printArray(int * arr,int len)
{
     
    for (int i=0;i<len;i++) 
    {
     
       cout << arr[i] << endl;
    }
}

int main()
{
     
    //1.创建数组
    int arr[3] = {
      10,20,30 };

    //2.获取长度
    int len = sizeof(arr) / sizeof(arr[0]);

    //3.打印数组的函数
    printArray(arr, len);

    //4.打印数组中最大的值
    Max(arr, len);
 
    return 0;
}

运行效果
C++基础教程12-指针_第9张图片

篇章

上一篇:C++基础教程11-函数

下一篇:C++基础教程13-结构体

你可能感兴趣的:(C++,c++)