前言
最近复习考研的知识,有机会研究一下C语言的指针,今天就总结一下有时候让我们爱的要死,有时候也恨得要死的指针,到底是什么?书里指针那章的序言说到了,不掌握指针就是没有掌握C的精华,word指针看来真的有他的厉害之处啊。话不多说,开始总结。
第一篇总结解决一下什么是指针的问题,做了一个小DEMO简要说明指针的用法。
指针定义
指针是一个值为内存地址的变量(或数据对象)
自己的理解:上边的定义简单扼要的告诉我们指针就是变量,变量又是什么呢?变量就是一块内存,就是一个地址,说白了指针就是保存内存地址的变量,有的书上也说了,指针就是地址。为什么要有指针呢?因为C语言的一大特点就是可以直接对物理操作,厉害了我的哥,所以说指针是C语言的一大灵魂嘛。
用内存图(来源于网络)来帮助理解:
1.首先定义了一个整型的变量,也就是分配了一个名叫year的内存空间,存放的内容是2016
2.定义了一个整型的指针变量,将year的地址付给了变量,也就是右边的指针指向左边的变量,因为现在指针里边存放的是year的地址,&这个符号是取地址的意思,下边会讲到
指针声明
1.C语言中NULL被定义为常量,第一行代表指针的初值设为空,表示指针不指向任何地址,不加有可能指向任意的地址
2.指针命名最好里边带有”P”
- <span style=“font-size:18px;”> int *ptr=NULL; // 等价于void *ptr
- int *ptr_num;
- char *ptr_name;
- float *money_ptr;
- double *p_price;</span>
int *ptr=NULL; // 等价于void *ptr
int *ptr_num;
char *ptr_name;
float *money_ptr;
double *p_price;
怎么用?(附赠小DEMO)
- &:代表取地址
- *:代表根据地址,找到变量,然后取变量值
- int num=9;
- int * ptr_num=#
- //取指针1的地址赋给指针2
- int * ptr_num2=&ptr_num;
- //%p指针占位符 % x 16进制占位符
- printf(”num变量的地址是:%p\t%x\n”,ptr_num,&num);
- printf(”\n指针ptr_num的地址:%p\n”,ptr_num2);
- //使用指针修改变量值
- *ptr_num=9999;//找到地址所指的内存地址,把这个地址的值改为9999
- printf(”* ptr_num对应的值为:%d\n”,*ptr_num);//取这个地址对应的值
int num=9;
int * ptr_num=#
//取指针1的地址赋给指针2
int * ptr_num2=&ptr_num;
//%p指针占位符 % x 16进制占位符
printf("num变量的地址是:%p\t%x\n",ptr_num,&num);
printf("\n指针ptr_num的地址:%p\n",ptr_num2);
//使用指针修改变量值
*ptr_num=9999;//找到地址所指的内存地址,把这个地址的值改为9999
printf("* ptr_num对应的值为:%d\n",*ptr_num);//取这个地址对应的值
上边的代码主要演示了一下:取变量地址和取地址对应变量的值,这两个操作,一个用的&,后一个使用*
上边代码也展示了如果通过操纵指针来改变变量的值,我们在看看内存是怎么体现的
综合的小DEMO:
- int num1=1024;
- int num2=2048;
- int * ptr1;
- int *ptr2;
- ptr1=&num1;
- ptr2=&num2;
- printf(”num1的值是%d\tnum1的地址是:%p\n”,num1,ptr1);
- printf(”num2的值是%d\tnum2的地址是:%p\n”,num2,ptr2);
- //将变量1的值,赋给变量2
- // num2=num1;*ptr2=*ptr1; 等价写法,可以把后者看成变量
- //直接操作指针
- ptr2=ptr1; //值没有变,地址变了
- printf(”重新赋值后:\n”);
- printf(”num1的值是%d\tnum1的地址是:%p\n”,num1,ptr1);
- printf(”num2的值是%d\tnum2的地址是:%p\n”,num2,ptr2);
- *ptr2=1111;
- printf(”重新赋值后:\n”);
- printf(”num1的值是%d\tnum1的地址是:%p\n”,num1,ptr1);
- printf(”num2的值是%d\tnum2的地址是:%p\n”,num2,ptr2);
int num1=1024;
int num2=2048;
int * ptr1;
int *ptr2;
ptr1=&num1;
ptr2=&num2;
printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);
//将变量1的值,赋给变量2
// num2=num1;*ptr2=*ptr1; 等价写法,可以把后者看成变量
//直接操作指针
ptr2=ptr1; //值没有变,地址变了
printf("重新赋值后:\n");
printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);
*ptr2=1111;
printf("重新赋值后:\n");
printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);
后记
了解一个概念就是反复的去实践,看看不同情况下的操作会得出什么样的结果,概念在实践中体会的会更加的深刻