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

2019-04-09  本文已影响0人  AkuRinbu

学习笔记

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

本文内容

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

一、栈

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

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、在函数内部动态申请内存,并返回指针

从函数返回指针

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

3、传递 指针的指针

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

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读