C语言的灵魂—指针
指针是什么
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。总结来说,指针就是指向地址的变量!
指针的作用
c语言指针可以有效地表示复杂的数据结构、动态分配内存、高效地使用数组和字符串、使得调用函数时得到多个返回值等。指针的应用往往与数组联系在一起,是最频繁的,也是最基础的。参数传递时只需要拷贝地址值,提高程序的运行效率。有效的表示数据结构,能动态分配内存。
指针
指针的语法
指针变量的定义: 类型 * 指针变量名
&:表示取地址操作
*: 表示取地址中的值
怎么去理解指针
大家可能一时半会可能很难理解指针含义。我们的计算机都会有一个内存,并且这个内存的每一个部分有一个标记表示它的位置,这个标识就是我们的地址,地址对应的区域存放的就是我们的数据(值)。就像我们住酒店,酒店是内存,门牌号是我们的地址,住在房间里的人就是我们的数据!
代码示例
#include<stdio.h>
int main(){
int num = 10;
double num2 = 10.0;
int * p ;
p = #
//这种不同类型的变量之前的操作是不合法的
// p = &num2;
printf("p = %p\n",p);
printf("num = %d\n",num);
printf("*p = %d\n",*p);
// num 和 p代表的是同一个地址的数据,
// 当使用 *p 去修改数据的时候,num代表的数据也会改变!
*p = 11;
printf("p = %p\n",p);
printf("num = %d\n",num);
printf("*p = %d\n",*p);
return 0;
}
/*
运行结果:
p = 0x7ffee1eee7c8
num = 10
*p = 10
p = 0x7ffee1eee7c8
num = 11
*p = 11
*/
通过以上代码我们不难理解:指针变量中,p 存放的是地址,*p 是取地址对应的值。num 变量直接存放地址对应的值!当我们使用 *p 修改数据的时候,我们 num 的存放的值也会发生改变!我们使用 & 符号即可取出变量的地址
举个例子,p 存放的是门牌号,*p 代表居住的客人,num 也是代表这个门牌号下居住的客人,当使用 *p 修改掉居住的人,num 也会发生相应的改变,因为他们代表的都是这个门牌号下居住的人。&num 即代表取出这个客人的房间门牌号
什么是双重(n重)指针
我们根据之前的解释可以知道,每个变量在内存中都有一个地址相对应。双重指针实际上存放的全是地址。
代码示例
#include<stdio.h>
int main(){
int num = 10;
int * p;
p = #
// 双重指针
int ** q;
// 指针变量也是变量的一种,即 p 也是有对应的地址
// &p 即取 p 变量的地址
q = &p;
// p 变量存放的地址 ,即num变量的地址
printf("p = %p\n",p);
// p 变量自身的地址
printf("p = %p\n",&p);
// q 存放的地址就是 p 变量自身的地址
printf("q = %p\n",q);
// *p == num
printf("*p = %d\n",*p);
// **q == *p == num
printf("**q = %d\n",*p);
return 0;
}
/*
执行结果:
p = 0x7ffee910c7c8
p = 0x7ffee910c7c0
q = 0x7ffee910c7c0
*p = 10
**q = 10
*/