C/C++指针小结

你想了解的C/C++指针小结攻略如下:

C/C++指针小结

1. 指针基础

指针是C/C++中一种重要的数据类型,它是用来存储变量地址的变量。

定义指针变量的方式为 类型名* 变量名,例如:

int* ptr;  // 定义一个指向整型变量的指针

获取变量地址的方式为 &变量名,例如:

int a = 10;
int* ptr = &a;  // 将a的地址赋值给ptr

访问指针所指向的变量的方式为 *指针变量名,例如:

int a = 10;
int* ptr = &a;
*ptr = 20;  // 将ptr所指向的变量的值修改为20,此时a的值也被修改为20

2. 指针和数组

指针和数组有着密切的联系,数组名本身就是一个指针,指向数组的首地址。

例如,定义一个包含5个元素的整型数组 arr

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

可以通过以下两种方式访问数组元素:

int x = arr[2];  // 访问数组arr的第3个元素,即值为3的元素
int y = *(arr + 4);  // 访问数组arr的第5个元素,即值为5的元素

3. 指针和函数

指针和函数有着密切的联系,可以通过指针来传递函数参数,也可以将函数地址赋值给指针。

3.1 指针传参

通过指针传参,可以在函数内部修改外部变量的值,例如:

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

int main()
{
    int x = 1, y = 2;
    swap(&x, &y);  // 将x和y的地址传递给swap函数
    // 此时x的值为2,y的值为1
    return 0;
}

3.2 函数指针

函数指针是指向函数的指针,可以通过函数指针来调用函数。

例如,定义一个返回值为整型,参数为两个整型的函数:

int add(int a, int b)
{
    return a + b;
}

可以将该函数的地址赋值给函数指针,例如:

int (*p)(int, int) = add;  // 将add函数的地址赋值给函数指针p
int result = (*p)(1, 2);  // 使用函数指针调用add函数,计算1+2的结果
// 此时result的值为3

4. 指针和动态内存分配

指针还可以用于动态内存分配,可以使用 newdelete 关键字来动态分配和释放内存。

例如,动态分配一个包含5个元素的整型数组:

int* ptr = new int[5];  // 动态分配5个整型变量的空间,返回一个指向该空间的指针

使用完后,需要使用 delete 关键字释放内存,例如:

delete[] ptr;  // 释放指向空间的指针ptr所指向的内存空间

5. 示例

5.1 实现二分查找算法

以下是一个使用指针在有序数组中查找指定元素的二分查找算法示例:

#include <iostream>

int* binary_search(int arr[], int size, int target)
{
    int left = 0, right = size - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (arr[mid] == target) {
            // 找到目标元素,返回其地址
            return &arr[mid];
        } else if (arr[mid] > target) {
            // 目标元素在左侧
            right = mid - 1;
        } else {
            // 目标元素在右侧
            left = mid + 1;
        }
    }
    // 未找到目标元素,返回nullptr
    return nullptr;
}

int main()
{
    int arr[] = {1, 2, 3, 4, 5};
    int* ptr = binary_search(arr, 5, 3);
    if (ptr != nullptr) {
        std::cout << "Element found at index " << ptr - arr << std::endl;
    } else {
        std::cout << "Element not found" << std::endl;
    }
    return 0;
}

5.2 实现链表数据结构

以下是一个使用指针实现链表数据结构的示例:

#include <iostream>

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

void printList(ListNode* head)
{
    ListNode* p = head;
    while (p != nullptr) {
        std::cout << p->val << " -> ";
        p = p->next;
    }
    std::cout << std::endl;
}

int main()
{
    // 创建一个包含3个元素的链表
    ListNode* head = new ListNode(1);
    ListNode* node1 = new ListNode(2);
    ListNode* node2 = new ListNode(3);
    head->next = node1;
    node1->next = node2;

    // 遍历并输出链表
    printList(head);

    // 释放链表所占用的内存空间
    while (head != nullptr) {
        ListNode* p = head;
        head = head->next;
        delete p;
    }

    return 0;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++指针小结 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C 程序 查找给定范围内的回文数

    C 程序 查找给定范围内的回文数题目是一个比较典型简单的回文数算法题,可以通过C语言编程实现。 下面是C程序实现查找回文数的完整使用攻略: 1. 确定算法和数据结构 题目要求查找给定范围内的回文数,所以可以选择使用“回文数判断算法”对给定的范围内的数逐一进行判断。 判断给定数x是否为回文数的算法可以用以下方式: 将这个数每一位上的数字存储到数组中(例如,数字…

    C 2023年5月9日
    00
  • C++中如何将数据保存为CSV文件

    C++中可以使用标准库中的fstream类来将数据保存为CSV文件。下面是完整的攻略: 步骤一:打开文件 首先,可以使用fstream类中的open函数打开一个CSV文件,打开文件需要指定需要操作的文件名、打开方式和文件存取权限。如果文件不存在,则可以使用out模式或者app模式创建文件,如果文件已经存在,则可以使用in模式或者in+out模式打开文件。 #…

    C 2023年5月23日
    00
  • C/C++ Qt 数据库与ComBox实现多级联动示例代码

    首先,我们要明确一下本文的目标,即通过C/C++ Qt编写代码实现数据库和ComBox的多级联动。下面是实现步骤和示例说明。 步骤一:建立数据库连接 我们需要使用Qt提供的QSqlDatabase类来建立与数据库的连接。在连接前,我们还需要确定数据库的类型和属性,例如,数据库的名称、主机名、用户名、密码等。以下是建立数据库连接的示例代码: QSqlDatab…

    C 2023年5月22日
    00
  • C语言模拟实现扫雷游戏

    C语言模拟实现扫雷游戏攻略 准备工作 在开始写代码之前,需要明确目标,并安装相关的开发环境。 目标 扫雷游戏是一个简单的窗口小程序,目标是在游戏窗口中展示一张地图,其中地图上有若干个格子,有些格子下面有地雷,有些格子是安全的。玩家需要用鼠标找出所有安全的格子,同时躲避所有的地雷。玩家在找到所有的安全格子之前不允许触碰到地雷,否则游戏结束。 开发环境 为了实现…

    C 2023年5月23日
    00
  • Linux系统下如何使用C++解析json文件详解

    下面是在Linux操作系统下如何使用C++解析Json文件的详细攻略。 1. 概述 在Linux系统下,C++解析Json文件的主要方式是使用第三方库,而rapidjson是其中一个被广泛使用的库,它提供了高性能、易使用、轻量级的Json解析功能,同时支持DOM(文档对象模型)和SAX(事件驱动)两种解析方式。接下来将以rapidjson为例,介绍如何在Li…

    C 2023年5月23日
    00
  • jQuery+ajax+asp.net获取Json值的方法

    获取Json值是Web开发中非常常见的任务,基于jQuery和Ajax技术结合asp.net框架可以轻松实现这一功能。下面是获取Json值的完整攻略: 1. 使用jQuery+Ajax获取Json值的基本流程 使用jQuery的$.ajax函数向服务器端发送GET或POST请求,并指定相应参数(包括请求类型、请求地址、数据类型等); 服务器端返回JSON格式…

    C 2023年5月23日
    00
  • Mac系统下源码编译安装MySQL 5.7.17的教程

    下面是“Mac系统下源码编译安装MySQL 5.7.17的教程”: 准备工作 在开始安装前,需要准备一下基础工作: 安装Xcode开发环境 Xcode 是 Mac 上的 IDE 工具,可以辅助开发各种编程语言的程序。获取安装包方式有两种: 在 Mac App Store 中搜索 Xcode 下载安装(需要苹果账号); 前往苹果的开发者网站手动下载并安装。(需…

    C 2023年5月22日
    00
  • C/C++ 恨透了 double free or corruption

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/IwSVImp5cOB3gZbaf0YiPw 写过 C/C++ 的都知道,内存允许程序员自主分配,用完了这些资源也得释放出来,这种在系统运行过程中动态申请的内存,称为动态内存。 常言道,借东西好借好还,下次再借也不难,但是有的…

    C语言 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部