服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 一起来了解一下C++中的指针

一起来了解一下C++中的指针

2022-09-23 15:57没有省略号 C/C++

这篇文章主要为大家详细介绍了C++的指针,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

1 指针的基本概念

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

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

2 指针变量的定义和使用

指针变量定义语法:

?
1
2
数据类型* 变量名;
&可以取地址;*可以取地址存放的值

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
using namespace std;
int main()
{
    int a = 10;
    //1.指针定义的语法:数据类型 * 指针变量名;
    int* p; //int* 定义一个指向整数型的指针变量
    p = &a;
    cout << "a的地址是:" << &a << endl;
    cout << "指针p是:" << p << endl;
    
    //2.使用指针,可以通过解引用的方式来找到指针指向的内存
    //指针变量前加* 代表解引用,就是找到一个地址内存中存放的数据
    *p = 100;
    cout << "a = " << a << endl;
    cout << "*p = " << *p << endl;
    
    system("pause");
    return 0;
}

3 指针所占内存空间

指针也是种数据类型,所以指针也是占内存的

  • 32位操作空间下,占用4个字节。
  • 64位操作空间下,占用8个字节。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
int main()
{
    int a = 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;
    cout << "sizeof(string*)=" << sizeof(string*) << endl;
    
    system("pause");
    return 0;
}

可以改变上面的x86(32位)和x64(64位),查看输出结果。

一起来了解一下C++中的指针

4 空指针和野指针

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

用途:初始化指针变量

注意:指针变量指向的内存是不可以访问的

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
int main()
{
    //1空指针用于给指针变量初始化.
    int* p = NULL;  //就是0
 
    //空指针是不可以进行访问的
    //0-255之间的内存编号是系统占用的,因此不可以访问
    *p = 100;
    //因为这里不可以访问,所以程序直接退出了,后面的代码不再执行。
    cout << p << *p << endl;
 
    system("pause");
    return 0;
}

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

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
using namespace std;
int main()
{
    //野指针
    int* p = (int*)0x1100;
    //这里定义的这个地址就是不属于我们当前地址空间的地址,就是越界了,也无法访问,所以程序会自动退出。
    cout << *p << endl;
 
    system("pause");
    return 0;
}

5 const修饰指针

const修饰指针有三种情况:

1.常量指针:指向常量的指针

2.指针常量:指针类型的常量

3.指向常量的指针常量:一个是本身就是常量的指针指向了一个常量。

?
1
2
3
4
5
6
7
8
9
10
const int* p = &a;  ---常量指针
特点:指针的指向可以修改,但是指针指向的值不可以修改。
(帮助理解:从右向左看,const在最后起固定作用,固定了*p的值,但是没有固定p的指向,即使改变了p的指向,*p也是不可更改的。)
 
int* const p = &a;  ---常量指针
特点:指针的指向不可以修改,但是指针指向的值可以修改。
(帮助理解:从右向左看,const在p获得地址后起固定作用,固定了p的指向,但是没有固定*p的值)
 
const int* const p = &a;
特点:指针的指向和指针指向的值都不可以修改。

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
using namespace std;
int main()
{
    int a = 10, b = 20;
 
    //常量指针
    const int* p = &a;
    //*p = 10;错误,指向的值不可修改
    p = &b;  //指向可以修改
    //*p = 30;即使指向改变,指向的值也是不可修改的。
    cout << *p << endl;
 
    //指针常量
    int* const p2 = &a;
    //p2 = &b;错误,指向不可修改
    *p2 = 100;//指向的值可以修改
    cout << *p2 << endl;
    //指向常量的指针常量
    const int* const p3 = &a;
    //p3 = &b;错误,指向不可修改
    //*p3 = 100;错误,指向的值不可修改
 
    system("pause");
    return 0;
}

6 指针和数组

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

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
using namespace std;
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    cout << "第一个元素为:" << arr[0] << endl;
    int* p = arr;//首地址赋予了指针变量p
    cout << p << endl;
    cout << "利用指针访问第一个元素:" << *p << endl;
    p++;//指针+1是加一存储单位,int型变量占4字节,所以+4
    cout << p << endl;
    cout << "利用指针访问第二个元素:" << *p << endl;
 
    char brr[2] = { 'a','b' };
    char* q = brr;
    cout << (int)q << endl;
    q++;   //字符型变量占1个字节,所以+1
    cout << (int)q << endl;
 
    //利用指针遍历数组
    p = arr;
    for (int i = 0; i < 10; i++)
    {
        cout << *p << endl;
        p++;
    }
 
    system("pause");
    return 0;
}

7 指针和函数

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

对比值传递,值传递是为形参另开辟一段内存进行运算;

而指针传递则是传递地址,通过对地址访问,就可以直接对实参做出改变。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>
using namespace std;
void swap01(int a, int b) //值传递
{  
    int temp = a;
    a = b;
    b = temp;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
}
void swap02(int* p1, int* p2)
{
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}
int main()
{
    int a = 10, b = 20;
    swap01(a, b);
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    swap02(&a, &b);
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    system("pause");
    return 0;
}

8 指针、数组、函数

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
using namespace std;
void coutarr(int* arr,int len)
{
    for (int i = 0; i < len; i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
}
void bubbleSort(int* arr, int len) //值传递
{
    for (int i = 0; i < len; i++)
    {
        for (int j = 0; j + i < len - 1; j++)
        {
            if (arr[j] > arr[j+1])
            {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}
int main()
{
    int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
    int len = sizeof(arr) / sizeof(arr[0]);
    cout << "排序前的数组为:" << endl;
    coutarr(arr, len);
    bubbleSort(arr, len);
    cout << "排序后的数组为:" << endl;
    coutarr(arr, len);
    system("pause");
    return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!     

原文链接:https://blog.csdn.net/qq_49030008/article/details/122930181

延伸 · 阅读

精彩推荐
  • C/C++在c和c++中实现函数回调

    在c和c++中实现函数回调

    如何在c和c++中实现函数回调呢?现在小编就和大家分享一下在c/c++中实现函数回调的示例代码,需要的朋友可以参考下...

    C++教程网2702020-12-18
  • C/C++C语言中字符的输入输出以及计算字符个数的方法详解

    C语言中字符的输入输出以及计算字符个数的方法详解

    这篇文章主要介绍了C语言中字符的输入输出以及计算字符个数的方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...

    C语言教程网9042021-03-17
  • C/C++C++ 约瑟夫环问题案例详解

    C++ 约瑟夫环问题案例详解

    这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    tingyun7242021-12-15
  • C/C++C/C++ Qt 给ListWidget组件增加右键菜单功能

    C/C++ Qt 给ListWidget组件增加右键菜单功能

    本篇文章给大家介绍ListWidget组件增加一个右键菜单,当用户在ListWidget组件中的任意一个子项下右键,我们让其弹出这个菜单,并根据选择提供不同的功能...

    LyShark5412022-03-07
  • C/C++C++ 中构造函数的实例详解

    C++ 中构造函数的实例详解

    这篇文章主要介绍了C++ 中构造函数的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下...

    Jhuster12192021-06-07
  • C/C++利用C语言编写“剪刀石头布”小游戏

    利用C语言编写“剪刀石头布”小游戏

    这篇文章主要给大家介绍了关于如何利用C语言编写“剪刀石头布”小游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定...

    张某婷10172021-10-08
  • C/C++纯C语言:递归最大数源码分享

    纯C语言:递归最大数源码分享

    这篇文章主要介绍了纯C语言:递归最大数源码,需要的朋友可以参考一下...

    C语言教程网4332021-01-13
  • C/C++c++版线程池和任务池示例

    c++版线程池和任务池示例

    这篇文章主要介绍了c++版线程池和任务池,实现任务执行完毕线程退出.在linux下压力测试通过...

    C++教程网6552021-01-16