C语言的指针详细介绍

  介绍

这篇文章主要讲解了“C语言的指针详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言的指针详细介绍”吧!

C语言的指针

C语言最臭名昭著的是就是其指针的使用,也是C语言的精华所在。很多人在学习C语言时,吐槽指针特别难以学习和使用。今天我们来探讨一下C语言指针的问题。

指针的引入

C语言一个特点就是<强>一切皆内存强,定义任何类型的变量,都要分配内存。在函数里定义变量,需要在栈内存上非配;定义全局变量,需要在静态内存区分配内存,就连定义函数,也要在静态区分配内存(这就是所谓的代码段存储区域);不固定大小的内存,需要在动态区分配内存。

有了内存,就需要操作内存,也就是读取或者写入内存数据C语言的最简单的内存操作就是通过<强>赋值操作符(<代码>=> ,实际就是改变<代码> 变量占用的内存的数据,甚至是用户自定义的结构体变量<代码> C> 占用的内存块的数据拷贝到<代码> C>

 int ;
  a =, 6;
  
  strcut  a_t
  {
  ,,int  m_a;
  ,,char  m_b;
  ,,shor  m_c;
  };
  
  struct  a_t  b;
  时间=a.m_a  1;
  a.m_b =, 2;
  时间=a.m_c  3;
  
  struct  a_t  c;//使用赋值运算符,将b里面所有成员的值赋给c里面的成员,即完成内存拷贝操作。
  时间=c  b; 

所以可以这样操作,是因为C语言的变量包含<强>内存的地址(通过<代码>和取)和<强>内存大小(通过<代码>运算符取),知道这两个信息,即使没有赋值运算符,也可以使用<代码> memcpy 实现赋值的功能,比如下面的代码,完全可以不使用赋值运算符,但实现了赋值的目的。

 # include  & lt; stdint.h>
  时间=static  int  g_test  0;
  
  int  main ()
  {
  ,,,int  a =, 1;
  ,,,//这里我们使用memcpy操作内存,实现赋值的操作
  ,,,memcpy(和g_test,,,,, sizeof (a));
  ,,,,
  ,,,return  0;
  }

但是这里有一个问题,即使C语言的函数参数传递只有<强>值传递强,就是说所有的变量通过参数传递,都会产生一份拷贝,唯一的办法就是传递变量的地址,这就产生的了用一个专门的<>强类型来存储变量的内存地址的需求,<强>指针应运而生了,这样做有下面的好处:

<李>

用一个专门的类型保存内存地址,比用现有类型(int <代码> ,<代码> unsigned int> <李>

引入语法,为了方便操作内存:像上面的操作一个语句就可以解决了<代码> int * addr=, g_test;* addr=1> 符号操作,也可以使用<代码>[]进行内存的偏移操作。

二级指针

C语言引入了指针,又衍生出个<强>二级指针强劲的概念,直接弄晕了一部分新生,其实二级指针只是语法的体现,本质上也是<强>指针强,是用来存储内存地址的,这个本质没有变化。比如:

 int  a =, 0;//p1存储的一地址
  int  * p1 =,,,//p2存储p1的地址
  int  * * p2 =,,, 

C语言的所有变量都是内存,都可以取地址,指针变量也不例外。不管是几级指针,都可以当做<强>一级指针使用,只要自己知道当前变量的意义然后处理好就可以了,比如下面的代码:

 int  alloc_mem (char  * p, int 大小)
  {
  ,,,char  * tmp_p =, (char  *) malloc(大小);
  ,,,//* p存储的是“p1”或者“p2”变量的内存地址,用memcpy直接将分配的内存地址付给到p指向的内存
  ,,,memcpy (p,和tmp_p, sizeof (char  *));
  ,,,,
  ,,,return  0;
  }
  
  int  alloc_mem1 (char  * * p, int 大小)
  {
  ,,,* p =, (char  *) malloc(大小);
  ,,,,,,,
  ,,,return  0;
  }
  
  int  main ()
  {
  ,,,char  * p1 =,空;
  ,,,char  * p2 =,空;
  ,,,,
  ,,,//利用c语言的强转
  ,,,alloc_mem ((char  *), p1, 2);
  ,,,,
  ,,,//利用二级指针
  ,,,alloc_mem1(及p2,, 2);
  }

C语言的指针详细介绍