`
leili
  • 浏览: 179979 次
社区版块
存档分类
最新评论

C/C++中二级指针的理解

 
阅读更多

以前在学习数据结构的时候一直没弄懂函数参数里面传递 ** p 以及使用 &的含义,这里摘抄了一小段文章方便理解。不懂的时候再看看这几段代码。

指针参数是如何传递内存的?

如果函数的参数是一个指针,不要指望用该指针去申请动态内存。见如下例子:

void GetMemory(char *ip, int num)

{

 ip = (char *)malloc(sizeof(char) * num);

}

void Test(void)

{

 char *str = NULL;

 GetMemory(str, 100); // str 仍然为 NULL

 strcpy(str, "hello"); // 运行错误

}

试图用指针参数申请动态内存

毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数ip的副本是 _ip,编译器使 _ip = ip.如果函数体内的程序修改了_ip的内容,就导致参数ip的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_ip申请了新的内存,只是把_ip所指的内存地址改变了,但是ip丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。

如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,见如下示例:

void GetMemory(char **p, int num)

{

 *p = (char *)malloc(sizeof(char) * num);

}

void Test(void)

{

 char *str = NULL;

 GetMemory(&str, 100); // 注意参数是 &str,而不是str

 strcpy(str, "hello");

 std::cout<< str << std::endl;

 free(str);

}

这里写一段自己的理解:这个程序是想通过函数给str指针分配一点内存--malloc,然后再给str指针赋值。。。注意这是在另一个函数内部改变str'指针的指向(str原来是指向NULL的,现在要使之指向函数GetMemory内分配的内存区域)所以要使用二级指针来实现,其实质就是改变str指针的指向(比如从 指向A 改为指向B),而不是改变str指针指向地址的内容哦。

用指向指针的指针申请动态内存

当然,我们也可以用函数返回值来传递动态内存。这种方法更加简单,见如下示例:

char *GetMemory(int num)

{

 char *ip = (char *)malloc(sizeof(char) * num);

 return ip;

}

void Test(void)

{

 char *str = NULL;

 str = GetMemory(100);

 strcpy(str, "hello");

 std::cout<< str << std::endl;

 free(str);

}

我们在做链表的时候,我们肯定希望在用一个函数creatLink(...)函数来增加链表节点。那么我们可以有2种方法来实现
第一种,用一级指针

这样做可以达到删除增加节点的目的,但是,在任何情况下,我们的操作都得死死地抓住头指针,也即是我们增加删除节点后,任何对链表长度的修改,我们都要 链表头指针返回,即 return head;所以,我们要通过这个函数最后获得头指针,抓住他,死死地抓住他,然后操作。

第二种方法:用双指针,也即是二级指针。


总结: 如果函数参数中传递的是指针,而且想改变传入指针的指向的话,则可以使用 二级指针来实现。(当然如果不在函数中的情况则可以直接给一级指针重新赋值使之指向另一个数据)

分享到:
评论

相关推荐

    C/C++中多级指针的线性剖析

    在C/C++中,二级指针的声明方式为`int **ptr;`,这里`ptr`是一个指向`int*`类型指针的指针。这意味着`ptr`可以存储另一个指针变量的地址。要访问通过二级指针指向的原始变量的值,我们需要连续使用两次解引用操作,...

    c/c++中的指针的应用及注意问题

    例如,`int *a`声明了一个指向整型变量的指针,而`int **a`则是一个指向指针的指针,即二级指针。对于`int *b[2]`和`int (*b)[2]`,前者表示一个包含两个整型指针的数组,后者表示一个指向包含两个整型元素数组的...

    C/C++之数组与指针的艺术

    本文旨在深入探讨C/C++中的两大核心概念——数组与指针,并澄清常见的误区。指针是C/C++编程语言的重要组成部分,它允许程序员直接操作内存地址,从而实现高效且灵活的程序设计。然而,由于其复杂性和与传统思维模式...

    C/C++语言中指针的四要素

    C/C++中的指针是编程语言的一个核心概念,它允许程序直接访问内存。指针具有几个关键要素,这四个要素共同定义了指针的行为和用途。首先是指针的类型,它决定了指针的大小和如何解释指针所指向的内存。指针类型由...

    C/C++程序员面试宝典

    在追求理想的职位过程中,深入理解和掌握C/C++语言的核心概念及应用技巧是至关重要的。 C/C++是两种广泛应用于系统级编程、游戏开发、高性能计算等领域的编程语言。C语言以其简洁高效著称,而C++则在此基础上增加了...

    C/C++高级编程pdf

    在这个领域,类的构造与指针的使用是核心且复杂的主题,它们是理解和利用C/C++强大功能的关键。 一、类的构造 类在C++中是面向对象编程的基础,它定义了一组数据(成员变量)和操作这些数据的方法(成员函数)。...

    linux c/c++基础学习资料(百度云链接和提取码)

    理解变量、数据类型、运算符、控制结构(如if-else、for、while)、函数、指针、数组、结构体等概念是C/C++学习的基石。对于C++,还需掌握类、对象、继承、多态、模板等特性。 “数据结构”是编程中的核心概念,...

    C/C++ 的指针经验总结

    二级指针(如`int **pp`)可以用来间接访问一级指针所指向的变量。 总的来说,C/C++的指针是一个强大但需谨慎使用的工具。理解指针的工作原理,熟练运用指针技巧,是成为一名高级C/C++程序员的必经之路。通过阅读这...

    C/C++中传递多维数组的各种方法

    在 C/C++ 中,还可以使用二级指针来传递多维数组。例如,在上面的示例代码中,我们使用二级指针 `float point` 来接受数组 `score`。在 `average` 函数和 `search` 函数中,我们使用强制转换来将数组名转换为二级...

    高质量C/C++编程指南

    1. **指针与内存管理**:C/C++中的指针是其强大特性之一,但同时也带来了内存管理的复杂性。指南详细讲解了指针的使用、动态内存分配与释放(如malloc/free和new/delete)以及内存泄漏问题。 2. **预处理器宏**:C/...

    C/C++程序四书五经

    - **内容亮点**:本书全面覆盖了C99、C89、传统C语言、各版本C运行库以及编写与C++兼容的C代码等知识体系,无论是初学者还是专业人士,都能从中找到所需的信息。 - **适宜读者**:适合所有阶段的C语言学习者,尤其...

    (c/c++)让你不再害怕指针

    // 通过二级指针访问一级指针指向的值 ``` 5. 动态内存分配与释放: 指针常用于动态内存管理,通过`new`和`delete`关键字来分配和释放内存: ```c++ int *p = new int; // 分配一个整型变量 delete p; // ...

    C/C++指针经验总结

    这篇"《C/C++指针经验总结》"教程旨在帮助你理解和掌握指针的使用,消除对指针的恐惧,通过丰富的实例来深入理解这一关键主题。 1. **指针的基本概念** - 指针是一个变量,它存储了一个内存地址,这个地址指向另一...

    c/c++指针总结...

    `:`p`是一个指向指向整型数据的指针(即二级指针)。 - `int p(int);`:`p`是一个函数,接受一个整型参数并返回一个整型值。 - `int (*p)(int);`:`p`是一个指向函数的指针,该函数接受一个整型参数并返回一个...

    数组与指针的艺术.doc

    例如,常见的误解包括将一维数组视为一级指针,二维数组视为二级指针,以及将数组名视为常量指针。实际上,这些说法并不准确。文章强调,数组名本身不是指针,而是代表了数组的首地址,这一概念会在后续章节详细解释...

    c/c++指针大突击

    例如,`int **ptr`是一个二级指针,它可以存储一个指向`int *`类型变量的地址。 数组与指针的关系紧密,数组名实质上就是一个指向数组首元素的指针。因此,我们可以通过指针遍历整个数组,实现快速访问和操作。 ...

    C/C++ 指针

    C/C++指针是该编程语言中极为重要和灵活的特性之一。本篇内容将详细解释指针的概念、类型、如何声明、以及指针在内存中的作用。 首先,指针是一种特殊的变量,它的作用是存储一个变量的内存地址。在C/C++中,每个...

    C/C++ 指针的资料合集

    在编程世界中,C 和 C++ 语言是底层...本资料合集将帮助你全面理解C/C++中的指针,通过实例和练习,你可以逐步掌握这些知识点,提升编程能力。在实践中不断探索和理解指针,你将能够更好地驾驭这两种强大的编程语言。

    c/c++ 数据结构

    在C/C++中实现这些数据结构时,需要掌握指针的使用,理解动态内存分配和释放,以及如何避免内存泄漏。此外,对算法的理解也非常重要,比如排序算法(冒泡、选择、插入、快速、归并等)、查找算法(顺序、二分查找)...

Global site tag (gtag.js) - Google Analytics