这篇文章主要讲解了“C语言的指针详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言的指针详细介绍”吧!
C语言的指针
C语言最臭名昭著的是就是其指针的使用,也是C语言的精华所在。很多人在学习C语言时,吐槽指针特别难以学习和使用。今天我们来探讨一下C语言指针的问题。
指针的引入
C语言一个特点就是<强>一切皆内存>强,定义任何类型的变量,都要分配内存。在函数里定义变量,需要在栈内存上非配;定义全局变量,需要在静态内存区分配内存,就连定义函数,也要在静态区分配内存(这就是所谓的代码段存储区域);不固定大小的内存,需要在动态区分配内存。
有了内存,就需要操作内存,也就是读取或者写入内存数据C语言的最简单的内存操作就是通过<强>赋值操作符强>(<代码>=> 代码)实现。比如下面的代码,赋值给变量<代码> 代码>,实际就是改变<代码> 代码>变量占用的内存的数据,甚至是用户自定义的结构体变量<代码> C> 代码,也可以直接使用赋值运算符将b <代码> 代码>占用的内存块的数据拷贝到<代码> 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语言的指针详细介绍