精华内容
下载资源
问答
  • c语言 解引用

    千次阅读 多人点赞 2019-01-02 09:55:38
    最近接触到了一个新的概念,叫“解引用”。就是在函数传参时,如果传入的是指针,在函数体中未对它解引用,那么,这个指针指向的值就不会发生改变。 引用别人博客中的概念: 在百度上面的解释是:"‘...

    前言

    最近接触到了一个新的概念,叫“解引用”。就是在函数传参时,如果传入的是指针,在函数体中未对它解引用,那么,这个指针指向的值就不会发生改变。
    引用别人博客中的概念:

    在百度上面的解释是:"‘解引用’,我倒觉得可以从另一个角度理解,"*“的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,“解"就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为"解引用”。也就是说,解引用是返回内存地址中保存的值。”,个人理解就是将指针p中的地址给解析出来

    参考这三篇博客,感谢他们。
    https://www.cnblogs.com/Mayfly-nymph/p/8213837.html
    https://blog.csdn.net/ifiwere/article/details/81063925
    https://blog.csdn.net/Murphy5222/article/details/81008260

    从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;
    }
    

    运行结果:

    在这里插入图片描述

    分析:

    1. 第一种swap是正确的用法。
    2. swap_err1,也是最常见的错误用法,没有传入指针,是值传递,不会改变主函数中a和b的值。
    void swap_err1(int a, int b) //未传递地址
    {
    	int tmp = a;
    	a = b;
    	b = tmp;
    }
    
    1. 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;
    }
    
    1. swap_err3,用到的指针传递,也解引用了,主要问题就是tmp指针变量未初始化,*tmp的值就是不确定的,也会导致程序出错。
    void swap_err3(int *p1, int *p2) //指针未初始化
    {
    	int *tmp;
    	*tmp = *p1;
    	*p1 = *p2;
    	*p2 = *tmp;
    }
    
    

    再谈申请内存

    在以前我的博客中也用到了申请内存。
    https://blog.csdn.net/qq_36327203/article/details/83019845

    再看一段程序:

    #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;
    }
    
    1. get_err运行结果:
      在这里插入图片描述
      分析:
      这里错误的原因其实也就是没有解引用,把指针p的地址赋值给函数的p,注意,并不是将p指向的内容的地址赋值给p,导致申请内存失败。也可以这样理解,指针传递,其实也用的是值传递,传递的是指针的地址,要想在函数中影响函数外的值,需要对指针指向的地址进行操作,也就是用*p = 5(取内容)操作。
    2. get运行结果:
      在这里插入图片描述
      这儿就是正确的用法,一般申请内存,用函数的话,需要用到二级指针,如果在主函数内部的话,直接申请就可以。

    与我联系

    QQ:1570553025
    github:https://github.com/myzcl
    微信公众号,扫二维码即可关注:
    在这里插入图片描述

    展开全文
  • C语言解引用

    2021-02-03 21:17:55
    在《C和指针》上面看到“解引用”这个名词,就好奇的去查了查。https://www.cnblogs.com/Mayfly-nymph/p/8213837.html 例: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(void) 5...

    在《C和指针》上面看到“解引用”这个名词,就好奇的去查了查。

    例:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int main(void)
     5 {
     6     int a=10;
     7     int *p=&a;
     8     *p=5;//这就是一个解引用
     9     system("PAUSE");
    10     return 0;
    11 }

    在百度上面的解释是:"'解引用',我倒觉得可以从另一个角度理解,"*"的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,"解"就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为"解引用"。也就是说,解引用是返回内存地址中保存的值。",个人理解就是将指针p中的地址给解析出来。

      看了之后还是迷糊迷糊的,于是上Google上查了“*”,维基上的解释是:“The asterisk is used to deference or to declare a pointer variable.”,在*p=5这里当然是前者的deferece了,但取消引用,什么是取消引用,取消什么呢?自己还是没有一个准确的概念,于是拿着这个问题请教了自己的师哥。花了近2个小时,终于明白了。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int main(void)
     5 {
     6     int a=10;
     7     int *p;
     8     p=&a;
     9     *p=5;
    10     printf("%d\n",*p);
    11     system("PAUSE");
    12     return 0;
    13 }

    引用(看例题),相当于使指针p指向于a。我们可以先一步一步理解:

    在内存中内存是一块一块的,这里的编号就是他们的地址。

    int a=10;

    先声明一个变量a给他一个小盒子,然后把10装进这个小盒子里面。

    然后对指针p,先分配给他一个小盒子(指针也是变量)。

    然后,

    p=&a//往小盒子里面放a的地址

     接着

    *p=5;//往小盒子里面放东西

    最后

    printf("%d\n",*p);//看小盒子里面有什么

    最后两行代码:一个写入数据,一个读取数据。这个就是解引用;

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3
    
     4 int main(void)
     5 {
     6     int a=10;
     7     int *p;
     8     p=5;
     9     system("PAUSE");
    10     return 0;
    11 }//这个代码不会炸(崩溃)
     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  
     4   int main(void)
     5  {
     6      int a=10;
     7      int *p;
     8      p=5;
     9      *p=5;
    10      system("PAUSE");
    11      return 0;
    12  }//这个代码炸了

    原因就是:p=5;表示将整型值5存储到指针p中(在指针p中是作为地址存在哦)

         *p=5;表示将整型值5储存到指针p小盒子里面的地址指向的那个小盒子里面。(地址5你知道有东西吗!)

    附加:变量一旦确定,在C语言里面,地址是不可更改的,所以不要把p=5理解成把指针p的地址改成5.

    下面是瞎玩的:~。~

    展开全文
  • C语言指针解引用注意事项

    千次阅读 2018-05-14 11:03:47
    在指针的操作中,间接运算符*,也被称为解引用运算符。注意事项最重要的一点是:不要解引用未初始化的指针如:int * pt;//未初始化的指针*pt=5;//这句话是错的为什么是错的,因为第2行的意思是把5储存在pt指向的...

    在指针的操作中,间接运算符*,也被称为解引用运算符。

    注意事项最重要的一点是:不要解引用未初始化的指针

    如:

    int * pt;//未初始化的指针

    *pt=5;//这句话是错的

    为什么是错的,因为第2行的意思是把5储存在pt指向的位置。但是pt未被初始化,其值是一个随机值,

    所以不知道将5储存在何处。

    因为:创建一个指针时,系统只分配了储存指针本身的内存,并未分配存储数据的的内存,因此,在使用

    指针之前,必须先用已分配的地址初始化它。如可以用一个现有变量的地址初始化该指针或者用malloc()

    函数先分配内存。

    展开全文
  • C语言--解引用

    2018-01-06 12:07:00
    在《C和指针》上面看到“解引用”这个名词,就好奇的去查了查。 例: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(void) 5 { 6 int a=10; 7 int *p=&a; 8 *p=5;/...

    在《C和指针》上面看到“解引用”这个名词,就好奇的去查了查。

    例:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int main(void)
     5 {
     6     int a=10;
     7     int *p=&a;
     8     *p=5;//这就是一个解引用
     9     system("PAUSE");
    10     return 0;
    11 }

     

    在百度上面的解释是:"'解引用',我倒觉得可以从另一个角度理解,"*"的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,"解"就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为"解引用"。也就是说,解引用是返回内存地址中保存的值。",个人理解就是将指针p中的地址给解析出来。

      看了之后还是迷糊迷糊的,于是上Google上查了“*”,维基上的解释是:“The asterisk is used to deference or to declare a pointer variable.”,在*p=5这里当然是前者的deferece了,但取消引用,什么是取消引用,取消什么呢?自己还是没有一个准确的概念,于是拿着这个问题请教了自己的师哥。花了近2个小时,终于明白了。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int main(void)
     5 {
     6     int a=10;
     7     int *p;
     8     p=&a;
     9     *p=5;
    10     printf("%d\n",*p);
    11     system("PAUSE");
    12     return 0;
    13 }

     

      解引用(看例题),相当于使指针p指向于a。我们可以先一步一步理解:

    在内存中内存是一块一块的,这里的编号就是他们的地址。

    int a=10;

    先声明一个变量a给他一个小盒子,然后把10装进这个小盒子里面。

    然后对指针p,先分配给他一个小盒子(指针也是变量)。

    然后,

    p=&a//往小盒子里面放a的地址

     接着

    *p=5;//往小盒子里面放东西

    最后

    printf("%d\n",*p);//看小盒子里面有什么

    最后两行代码:一个写入数据,一个读取数据。这个就是解引用;

     

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3

    4 int main(void)
     5 {
     6     int a=10;
     7     int *p;
     8     p=5;
     9     system("PAUSE");
    10     return 0;
    11 }//这个代码不会炸(崩溃)

     

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  
     4   int main(void)
     5  {
     6      int a=10;
     7      int *p;
     8      p=5;
     9      *p=5;
    10      system("PAUSE");
    11      return 0;
    12  }//这个代码炸了

    原因就是:p=5;表示将整型值5存储到指针p中(在指针p中是作为地址存在哦)

         *p=5;表示将整型值5储存到指针p小盒子里面的地址指向的那个小盒子里面。(地址5你知道有东西吗!)

    附加:变量一旦确定,在C语言里面,地址是不可更改的,所以不要把p=5理解成把指针p的地址改成5.

    下面是瞎玩的:~。~

     

    转载于:https://www.cnblogs.com/Mayfly-nymph/p/8213837.html

    展开全文
  • 1.解引用int main() {int a = 10; int b = 20; printf("%d %d\n",a,b);//10 20int *p = &a;//p里保存a的地址 *p = 100;//对p解引用,将p指向的地址的内容赋为100 p = &b;//p指向b *p = 200;//将p指向的地址的内容赋...
  • c语言-引用与指针

    2020-01-31 21:34:38
    2. 引用使用时无需解引用(*),指针需要解引用; 3. 引用只能在定义时被初始化一次,之后不可变;指针可变; 4. 引用没有 const,指针有 const; 5. 引用不能为空,指针可以为空; 6. “sizeof 引用”得到的是所...
  • 但对于*,翻译为“解引用”,字面意思不好理解,即使看了后面内容才知道不过是“取指针指向的地址的内容”,也仍然是觉得怪怪的,“解引用”这个词难记也难于从字面直接判断意思,以致时间长了还是感觉像见了熟悉的...
  • 解引用 * 就像解开盒子的秘密一样 盒子里面装的是a的操作地址 当我解密这个操作地址 我就找到a啦 3. 对 * p的操作其实就是对a的操作 4. * & p = > & a ; ============================...
  • #include int main(void) { const char * mesage = "wo,e"; printf("%s", mesage); } 为什么不是printf("%s", mesage);?不用解引用吗?
  • 定义一个tmp整型指针变量,对其解引用,来作为变量p1,p2解引用后交换数据的中间介质。如下图。编译器显示程序崩溃。崩溃的原因是由于对未初始化的指针进行了解引用操作。(未初始化的指针称为野指针或悬挂指针,它...
  • C语言的&(取地址) 和 *(解引用

    千次阅读 2019-03-13 13:00:42
    &amp;p理解为指向p指针的地址 *p理解为指向p指针地址所存在的值
  • 最后我们来讨论最后一个终极大问题就是为什么p作为一个数组指针,通过一次解引用(*p)没有理应得到该指针指向的数组对象的值,反而是一个数组名的左值呢? 一开始我也百思不得其解。我们再次回到我上面对关于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 492
精华内容 196
关键字:

c语言解引用

c语言 订阅