c语言指针复习 难点突破 双重指针 函数指针结构体指针等...

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);

如何用函数指针调用函数:

 

 

 

 

 

posted @ 2022-01-14 09:49  然终酒肆  阅读(193)  评论(0编辑  收藏  举报