学习笔记
《深入理解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
存的是&num
即0x1234
那么传递的就是0x1234
这个值
二、(1)将指针传递给函数
1、传递的是指针
传递的是指针- 传入指针的交换函数
void swapWithPointers(int* pnum1, int* pnum2) {
int tmp;
tmp = *pnum1;
*pnum1 = *pnum2;
*pnum2 = tmp;
}
传递的是指针,其实本质上传递的仍是传入参数的值pnum1与pnum2,
pnum1
是&n1
,pnum2
是&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、为什么不能直接传入
为什么不能直接传入 vectorvector
这里使用了
( int *)7
,是想证明,vector
的值的确有很好地传递给arr
,但是随着函数之后动态申请了内存,并将申请的内存地址传递给arr
后,arr
的内容就随之改变了
程序真正修改的是在函数内动态申请的内存,这个动态申请的内存地址存在
arr
里面,但是关我vector
什么事
arr
是函数的传入参数,它也要被压栈,它在内存中也有一席之地,但是在函数执行完之后,arr
就不存在了,arr
不存在之后,那份动态申请的内存空间没有人可以访问到了
蓝线标出,
vector
从头到尾的内容都没变
网友评论