99.99%的人不会研究c 指针的高级用法 因为连课本都对此避之不及 实际应用一些小项目小问题也不会用双重指针啊啥的...
就导致绝大部分人,比如我都压根不探究这些
今天本着求知的态度去学习
首先来看指针运算,这个就当复习玩
打印指针 是地址 都懂 指针本来就取的地址
指针加减整数呢?
本来pa 是15006356(地址) 怎么加了10就成了15006396? 不应该是15006366吗? 加了40
用double呢
怎么加了40?
用char
+5 之后确实是+5 不是+40
公式: 指针+- 整数 实际增加/减少为: 整数*sizeof(ElementType) 其中ElementType为数据类型
指针- 指针:
596-584 = 12 = 3*4 = 3*sizeof(ElementType)
公式: 指针+- 指针 实际增加/减少为: 地址差值 / sizeof(ElementType) 其中ElementType为数据类型
意思就是 他们差了3倍的数据类型单位长度啊
在连续内存中:
加1就是加了一个sizeof (int) 对的 这就是前面所讲指针的运算
这些等价:应该都懂
公式:
设数组名为arr,则 arr + n = &arr[n];//数组名就是数组首地址,函数名也是。
arr[n] = *(arr + n)
用指针遍历数组:
双重指针:
就是指向指针的指针。
这段代码 目的是 把str的空间大小改为6。然后把china这个字符串拷贝进去。因为字符串以/0 结尾 所以大小不是5是6.
但是 事实上 这样做 str的大小呢 还是null
因为 函数传参是传值罢了。仅仅传一个值、想要改变真正的值,肯定要用地址。你用一个*类型的 去改动*类型 怎么可能呢。
这个分配的 6 存储空间 本质上是给了memorystr 然后局部变量 函数运行完毕释放了。
怎么真正改呢?
我们不妨这么理解。要改动char str,需要修改char* str
那么要改动char * str ,就要用到char** str 。
所以这个双重指针就是很简单 用来改变一重指针呗。
上边的代码 就是调用GetMemory时 因为参数是** 传值 传给了**一个*(能看懂么)
这个取地址就成了一级指针 *
所以呢 这其中其实是修改了二级指针的指向
此时**memorystr = &str 即
**memorystr 指向了str的地址
*memory 指向了str
对*memory指向的元素 (str)进行了改动 当然可以成功
再来看一个双重指针的例子
目的是改变传入的值是bbb 但是实际输出还是aaa
由上边讲到的,改变这个char * 肯定要用char**
**p = &v 当做**p = *v
那么*p = v
p指针指向v
对*p赋值就是对v赋值 对吧
建议大家多找 多做一些这样的例子
函数指针:指向函数的指针变量
int(*p)(int x , int y);
指针函数:是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。(没什么用)
这么写:
int *fun(int x,int y); int * fun(int x,int y); int* fun(int x,int y);
如何用函数指针调用函数: