美文网首页
[C指针]指针与函数:传递指针给函数、从函数返回指针

[C指针]指针与函数:传递指针给函数、从函数返回指针

作者: AkuRinbu | 来源:发表于2019-04-09 17:54 被阅读0次

学习笔记

《深入理解C指针》
http://www.ituring.com.cn/book/1147
第3章 指针与函数

本文内容

一、栈
二、通过指针传递和返回数据
(1)将指针传递给函数
1、传递的是指针
2、传递的是值
3、传递指向常量的指针
(2)从函数返回指针
1、在函数内部动态申请内存,并返回指针
2、在函数内部创建局部数组
3、传递 指针的指针

一、栈

  • 栈是从高地址低地址生长的
  • 依次压入 传入参数返回地址局部变量
  • 传入参数可以从左向右、也可以从右向左,但是总是比局部变量先压入
  • 表现在数值上就是先压入的数值更大
  • 从数值上可以看见,4字节表示一个地址,传入参数与局部变量之间有一个"断掉的部分",那就是返回地址
    栈:传入参数、返回地址、局部变量

二、通过指针传递和返回数据

  • 想干什么?

1、想要在函数中修改数据,传递数据的指针
2、想要保证数据在函数中不被修改,传递指向常量的指针
3、想要修改指针的内容指针存的地址,不是指针自身所在地址),传递指针的指针

  • 传递参数(包括指针)时,传递的是它们的值。也就是说,传递给函数的是参数值的一个副本。

假设传递的是一个 int num = 10
num位于0x1234
传递的是 10 这个值

假设传递的是一个 int *pi = &num
pi自身位于 0x8000
pi存的是&num0x1234
那么传递的就是 0x1234 这个值

二、(1)将指针传递给函数

1、传递的是指针

传递的是指针
  • 传入指针的交换函数
void swapWithPointers(int* pnum1, int* pnum2) {
    int tmp;
    tmp = *pnum1;
    *pnum1 = *pnum2;
    *pnum2 = tmp;
}

传递的是指针,其实本质上传递的仍是传入参数的值pnum1与pnum2pnum1&n1pnum2&n2,见红笔与蓝笔

传入参数本身当然也需要压入栈,所谓的压入栈就是在内存中有一席之地了,那么传入参数自身所在内存的那一席之地就是 &pnum1 与 &punm2,见黄笔

红笔与蓝笔的相同两者与黄笔的不同,正是既说明了传入指针时传入的是参数的值;又说明了传入参数其实是一个新的变量(它拥有全新的地址)

  • 典型的错误写法
void swapWithPointers(int* pnum1, int* pnum2) {
    int* tmp;
    tmp = pnum1;
    pnum1 = pnum2;
    pnum2 = tmp;
}
典型的错误写法

错误在于,虽然传递的是指针,但是仅仅交换的只是两个传入参数的值,只是把传入参数里面存的地址交换了一下,影响不到n1与n2

2、传递的是值

传递的是值

红笔标出,显示的是n1的地址,黄色标注的是函数内的局部变量num1的地址,很明显这是两个不同的地址

传递的是值的时候,交换的是 num1与num2
n1与n2 没有关系了

3、传递指向常量的指针

  • 如果不希望数据被修改,就要传递指向常量的指针

如何声明指向常量的指针?
https://www.jianshu.com/p/d0330748c925
两种等价写法
const int * pci;
int const * pci;

  • 甚至无法通过编译
试图通过 指向常量的指针 去 修改 常量
参数不匹配,第二个参数想要指向变量的指针
需要左值,左值就是可以放到等式左边的东西

二、(2)从函数返回指针

1、在函数内部动态申请内存,并返回指针

从函数返回指针
  • vector变量的值是在函数内分配的内存地址
  • arr在函数执行完毕后就消失了,但是申请的内存空间依旧存在
  • 从函数返回指针,其实本质还是返回指针的值指针里存的地址,而不是指针自身所在)
  • C语言,就是值传递

2、在函数内部创建局部数组

  • 函数执行结束时,局部数组申请的内存就失效了
  • warning: function returns address of local variable
    警告:返回的是局部变量的地址

3、传递 指针的指针

  • 1、传入的参数是 &vector,是 整型指针 自身的内存地址

    &vector
    各个变量的含义
  • 2、为什么不能直接传入 vector

    为什么不能直接传入 vector

这里使用了( int *)7,是想证明,vector的值的确有很好地传递arr,但是随着函数之后动态申请了内存,并将申请的内存地址传递给arr后,arr的内容就随之改变了

程序真正修改的是在函数内动态申请的内存,这个动态申请的内存地址存在arr里面,但是关我vector什么事

arr是函数的传入参数,它也要被压栈,它在内存中也有一席之地,但是在函数执行完之后,arr就不存在了,arr不存在之后,那份动态申请的内存空间没有人可以访问到了

蓝线标出,vector从头到尾的内容都没变

相关文章

  • [C指针]指针与函数:传递指针给函数、从函数返回指针

    学习笔记 《深入理解C指针》http://www.ituring.com.cn/book/1147第3章 指针与函...

  • Redis

    1.指针函数与函数指针 指针函数本质是指针,其返回值是指针。如 float *fun(); 函数指针,本质是指针。...

  • 函数和指针

    函数指针: 指向函数的指针(是指针)指针函数:返回值是指针的函数(是函数)

  • C语言

    C 指针、指针变量、函数指针、指针函数、指针数组、数组指针、C 数组

  • 指针

    一. 指针指向的是对象的地址//函数指针:指针指向函数//指针函数:函数返回指针 二.

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • NDK启航篇——C语言基础(函数指针)

    昨天介绍了指针类型、空指针、指针运算,今天来写一下函数指针 函数指针 函数指针的定义:函数的返回值类型(函数指针的...

  • c语言中的注册函数、回调函数(callback)以及多态的实现

    一、函数指针 函数指针:指向存放函数空间首地址的指针变量。 函数指针的定义方式为: 函数返回值类型 (* 指针变量...

  • C++:函数指针 & 返回函数指针的函数

    函数指针 & 返回函数指针的函数 一、函数指针的声明和使用 声明一个函数指针,给它赋值并调用它指向的函数 函数指针...

  • 指针函数与函数指针

    一、指针函数与函数指针的定义 1、指针函数 指针函数是指带指针的函数,它的本质上是一个函数,只是返回的是某种类型的...

网友评论

      本文标题:[C指针]指针与函数:传递指针给函数、从函数返回指针

      本文链接:https://www.haomeiwen.com/subject/luybiqtx.html