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语言实现简易通讯录完整流程 1. 需求分析 在编写“C语言实现简易通讯录”的过程中,我们需要实现以下功能:1. 添加联系人2. 删除联系人3. 修改联系人4. 查找联系人5. 显示联系人 2. 思路设计 2.1 数据结构设计 为了实现通讯录功能,我们可以定义如下结构体存储联系人信息: #define NAME_MAX_LENGTH 20 #define P…

    C 2023年5月23日
    00
  • log4j2 项目日志组件的实例代码

    以下是详细讲解“log4j2 项目日志组件的实例代码”的完整攻略。 什么是log4j2 log4j2是一个Java日志框架,可以提供高效灵活的日志记录服务,供各种Java应用程序使用。它是Apache软件基金会下的一个开源项目,其具备下列特点: 多种输出方式:文件、控制台、数据库等 丰富的API:易于使用、易于扩展 完善的日志级别:支持丰富的日志级别,能够控…

    C 2023年5月22日
    00
  • Win7系统打开软件提示错误代码0xc0000022是什么原因?怎么解决?

    Win7系统打开软件提示错误代码0xc0000022的原因 当Windows 7系统出现错误代码0xc0000022时,表示发生了访问认证错误,无法打开指定的软件。这个错误有多种原因,其中两个最常见的原因是权限问题和受损的软件。 权限问题 如果您不具有打开某个软件的访问权限,则会触发此错误。当您在不具有管理员权限的用户账户下尝试打开受保护的应用程序或系统应用…

    C 2023年5月23日
    00
  • C++中map和vector作形参时如何给定默认参数?

    C++中,map和vector是常用的STL容器之一,它们通常被用作函数的参数,但是有时候我们需要为这些参数设置默认值。本文将详细讲解C++中map和vector作为形参时如何给定默认参数的方法。 map作为形参时如何给定默认参数 为了设置map的默认参数,我们需要在函数声明中使用“=”运算符来给map参数设置默认值。下面是一个使用map的函数,并设置默认参…

    C 2023年5月23日
    00
  • C语言字符串处理的惊天大坑问题解决

    下面我将详细讲解C语言字符串处理的惊天大坑问题解决的完整攻略。 引言 字符串处理是计算机编程中常见的操作。而在C语言中处理字符串却会遇到很多坑,这些坑以常见的字符串操作函数如strcpy、strlen、strcat等为代表,涉及内存操作、越界等问题。本篇文章将介绍C语言字符串处理的常见坑点、原因和解决方法,并以实际例子进行说明。 常见问题和原因 内存越界 在…

    C 2023年5月30日
    00
  • C语言算法练习之数组求素数

    C语言算法练习之数组求素数 概述 本篇文章将介绍如何使用C语言实现数组求素数的算法。素数,又称质数,是指除了1和它本身以外,不能被其他自然数整除的正整数。本篇文章的算法流程如下:输入一个正整数n,计算出小于等于n的所有素数,将它们存储在一个数组中,并输出这些素数。该算法将使用C语言实现。 算法实现 1. 定义函数 首先,我们需要定义一个函数来计算小于等于n的…

    C 2023年5月22日
    00
  • C语言循环链表的原理与使用操作

    C语言循环链表是一种基于链表数据结构的可循环访问的存储方式。与线性表相比,链表能够优化数据的插入和删除操作的效率,并且支持动态的内存分配。而循环链表则定义了表头尾相接,最后一个节点指向第一个节点的链表。下面将详细讲解循环链表的原理、使用操作及其实现过程,以及两个示例进行说明。 原理 循环链表是由多个节点组成的链式结构,每个节点包含自身的数据和指向下一个节点的…

    C 2023年5月24日
    00
  • 电脑开机黑屏错误提示0xc0000e9怎么办?

    电脑开机黑屏错误提示0xc0000e9的解决方法 问题描述 当你从电脑开机时,如果出现了“电脑开机黑屏错误提示0xc0000e9”的错误,那么说明电脑在启动过程中遇到了一些问题,无法正常启动。这时电脑会停在黑屏界面,无论你进行任何操作,都无法进入系统。此时应该如何处理呢? 解决方法 方法一:检查硬件连接 0xc0000e9错误通常是硬件损坏或者连接错误导致的…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部