前言
在百度上面的解释是:“‘解引用’,我倒觉得可以从另一个角度理解,”*“的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,“解"就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为"解引用”。也就是说,解引用是返回内存地址中保存的值。”,个人理解就是将指针p中的地址给解析出来
参考这三篇博客,感谢他们。
https://www.cnblogs.com/Mayfly-nymph/p/8213837.html
https://blog.csdn.net/ifiwere/article/details/
https://blog.csdn.net/Murphy5222/article/details/
从swap()函数谈起
首先,我们来看swap的常见错误用法。
void swap(int *p1, int *p2) {
int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; } void swap_err1(int a, int b) //未传递地址 {
int tmp = a; a = b; b = tmp; } void swap_err2(int *p1, int *p2) //未解引用 {
int *tmp; tmp = p1; p1 = p2; p2 = tmp; } void swap_err3(int *p1, int *p2) //指针未初始化 {
int *tmp; *tmp = *p1; *p1 = *p2; *p2 = *tmp; } int main() {
int a = 10, b = 20; printf("[swap] before a = %d, b = %d\n", a, b); swap(&a, &b); printf("[swap] later a = %d, b = %d\n\n", a, b); a = 10, b = 20; printf("[swap_err1] before a = %d, b = %d\n", a, b); swap_err1(a, b); printf("[swap_err1] later a = %d, b = %d\n\n", a, b); a = 10, b = 20; printf("[swap_err2] before a = %d, b = %d\n", a, b); swap_err2(&a, &b); printf("[swap_err2] later a = %d, b = %d\n\n", a, b); a = 10, b = 20; printf("[swap_err3] before a = %d, b = %d\n", a, b); swap_err3(&a, &b); printf("[swap_err3] later a = %d, b = %d\n\n", a, b); return 0; }
讯享网
运行结果:
分析:

- 第一种swap是正确的用法。
- swap_err1,也是最常见的错误用法,没有传入指针,是值传递,不会改变主函数中a和b的值。
讯享网void swap_err1(int a, int b) //未传递地址 {
int tmp = a; a = b; b = tmp; }
- swap_err2,其实就是没有解引用,虽然传入的是a和b的地址,但是没有对相应的地址进行操作,也就是未解引用,所以,这个函数的就是把a和b的地址赋值给p1p2,p1p2的地址进行了交换,函数结束,p1p2释放,对值函数的ab值也没产生影响。
void swap_err2(int *p1, int *p2) //未解引用 {
int *tmp; tmp = p1; p1 = p2; p2 = tmp; }
- swap_err3,用到的指针传递,也解引用了,主要问题就是tmp指针变量未初始化,*tmp的值就是不确定的,也会导致程序出错。
讯享网void swap_err3(int *p1, int *p2) //指针未初始化 {
int *tmp; *tmp = *p1; *p1 = *p2; *p2 = *tmp; }
再谈申请内存
再看一段程序:
#include <stdio.h> #include <stdlib.h> void get(int **p, int n) {
*p = (int *)malloc(sizeof(int) * n); if (p == NULL) {
printf("malloc failde!\n"); } else {
printf("in get address is %p\n", *p); } } void get_err(int *p, int n) {
p = (int *)malloc(sizeof(int) * n); if (p == NULL) {
printf("malloc failde!\n"); } else {
printf("in get address is %p\n", p); } } int main() {
int *p = NULL; //get(&p, 10); get_err(p, 10); printf("in main address is %p\n", p); return 0; }
- get_err运行结果:

分析:
这里错误的原因其实也就是没有解引用,把指针p的地址赋值给函数的p,注意,并不是将p指向的内容的地址赋值给p,导致申请内存失败。也可以这样理解,指针传递,其实也用的是值传递,传递的是指针的地址,要想在函数中影响函数外的值,需要对指针指向的地址进行操作,也就是用*p = 5(取内容)操作。
引用 Be_yourself113 的解释:
还有 未解引用 应该这样理解。我知道你这块空间的地址,我可以通过地址 访问和修改 该块空间里面的内容。修改 就称为解引用,反之则 未解引用。
- get运行结果:

这儿就是正确的用法,一般申请内存,用函数的话,需要用到二级指针,如果在主函数内部的话,直接申请就可以。
与我联系
:
github:https://github.com/myzcl
微信公众号,扫二维码即可关注:




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/68198.html