A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于鸿鹏 中级黑马   /  2015-11-3 14:49  /  1114 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 于鸿鹏 于 2015-11-3 14:53 编辑

C语言中的指针总结(一)

一、定义指针:内存单元的编号或者地址称为指针,指针是一个地址,因此指针是常量
指针变量:专门用来存放另一个变量地址的变量,指针变量的值是地址,它可以存放不同的地址,因此指针变量是变量
定义指针变量:
类型名  * 指针变量名; 例如: int *p;
其中 * 表示是一个指针变量,表示改指针变量指向的数据类型是整型

特点:1、多个指针可以指向同一个地址
   2、指针指向可以改变的
   3、指针没有初始化时,指针的值是垃圾值,称野指针
注意:1、在定义时,* 表示定义的变量是指针变量,变量的值只能存放地址
   2、一个类型的指针只能指向相同类型的变量,不能指向其他类型的变量
   3、指针变量可以声明为全局、静态局部或局部
二、指针变量初始化1、定义的同时进行初始化
int *p = &a;
2、定义的同时部分初始化
int *p1 = &a,*p2;
     *p2 = &a;
p1和p2同时都指向了a
3、初始化为NULL
int *p = NULL;//本质是为0
int *p = 0;//和NULL效果一样
p指向了空
4、先定义后初始化(不建议使用)
int *p4 ;
     *p4 = &a; //先定义后初始化
三、指针的应用1、例如:用指针实现两个数的交换
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. //用指针实现:输入两个整数,按先大后小的顺序输出
  6.         //定义两个指针
  7.         int *p1, *p2, *p;
  8.     //定义两个变量
  9.     int  a, b;
  10.     //提示用户输入
  11.     printf("请输入两个整数\n");
  12.     //接收键盘输入的数
  13.     scanf("%d%d",&a,&b);
  14.     //让指针p1指向a的地址
  15.     p1 = &a;
  16.     //让p2指向b的地址
  17.     p2 = &b;
  18.     //判断两个数的大小
  19.     if(a < b)
  20.     //将a和b的值进行交换
  21.     {
  22.                 //让p和p1所指的地址,即p指向了a的地址
  23.                 p = p1;
  24.         //让p1指向p2所指向的地址,即p1指向了b的地址
  25.         p1 = p2;
  26.         //让p2指向p所指向的地址,即p2指向了a的地址
  27.         p2 = p;
  28.     }
  29.     //输出a和b的值
  30.         printf("a = %d        b = %d\n",a,b);
  31.     //输出p1和p2所指向的地址的值
  32.     printf("Max = %d  Min = %d\n",*p1, *p2);
  33.         system("pause");
  34.         return 0;
  35. }
复制代码

利用函数无法完成上面所提出的需求,因为调用函数的时候系统分配的存储空间在函数调用完成之后就会全部释放,无法主函数中a和b的值无法改变

2、在被调函数中可以修改主调函数的变量
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //定义一个函数
  4. void changeValue(int *p){
  5.         //将100赋值给指针p所指向的地址内容
  6.     *p = 100;
  7. }
  8. int main()
  9. {
  10.         int a = 1;
  11.     //定义一个指针并指向a
  12.     int *p1 = &a;
  13.     //打印a的地址
  14.     printf("%p\n",&a);
  15.     printf("%p\n",p1);
  16.    
  17.     //打印出a的值
  18.     printf("%d\n", a);               
  19.     printf("%d\n", *p1);     
  20.    
  21.     //调用函数
  22.     changeValue(p1);
  23.    
  24.     //再次打印a的地址
  25.     printf("%p\n",&a);
  26.     printf("%p\n",p1);
  27.    
  28.     //打印出a的值
  29.     printf("%d\n", a);               
  30.     printf("%d\n", *p1);   
  31.         system("pause");
  32.         return 0;
  33. }
复制代码

3、让函数有多个返回值
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //定义一个函数可以计算两个整数的加减乘除运算
  4. void test(int x, int y, int *Jia, int *Jian, int *Cheng, float *Chu)
  5. {
  6.         //加减乘除运算实现
  7.     *Jia = x + y;
  8.     *Jian = x - y;
  9.     *Cheng = x*y;
  10.     *Chu = x/(float)y;
  11. }
  12. int main()
  13. {
  14.         int jia;
  15.     int jian;
  16.     int cheng;
  17.     float chu;
  18.         //调用test函数
  19.     test(24, 7, &jia, &jian, &cheng, &chu);
  20.     printf("%d\n%d\n%d\n%f\n",jia,jian,cheng,chu);
  21.         system("pause");
  22.         return 0;
  23. }
复制代码

总结:
1、指针就是地址,地址就是指针/2、地址就是内存单元的编号
3、指针变量是存放地址的变量
4、指针和指针变量是两个不同的概念
5、但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样

四、二级指针二级指针:存放一个指针变量地址的指针变量地址称为二级指针
int *p:表示以p的内容为地址的变量
int **p:表示以*p的内容为地址的变量
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.     int a = 100;
  6.     //定义一级指针并且指向a
  7.     int *p = &a;
  8.     //定义一个二级指针
  9.     int **q = &p;
  10.     //定义一个三级指针
  11.     int ***r = &q;
  12.     //打印地址
  13.     printf("a的地址为:%p\n",&a);
  14.     //打印值   
  15.     printf("  a的值为:%d\n",a);
  16.    
  17.     //打印地址
  18.     printf("p的地址为:%p\n",&p);
  19.     //打印值   
  20.     printf("  p的值为:%p\n",p);
  21.    
  22.     //打印地址
  23.     printf("q的地址为:%p\n",&q);
  24.     //打印值   
  25.     printf("  q的值为:%p\n",q);
  26.    
  27.     //打印地址
  28.     printf("r的地址为:%p\n",&r);
  29.     //打印值   
  30.     printf("  r的值为:%p\n",r);   
  31.     //打印a的值
  32.     printf("%d\n",a);
  33.     printf("%d\n",*p);
  34.     printf("%d\n",**q);
  35.     printf("%d\n",***r);   
  36.         system("pause");
  37.         return 0;
  38. }
复制代码

总结

二级指针及多级指针可以这样理解:
1、int ***   类型的只能存放int ** 类型的变量的地址
2、如果定义了 int *p;  则取地址的&p 就是 int ** 类型的,它就是一个二级指针,因为变量p是 int * 类型的。


8 个回复

倒序浏览
总结的好全面,学习保留一份
回复 使用道具 举报
xiaobei 发表于 2015-11-3 18:18
总结的好全面,学习保留一份

谢谢  我怕被删帖呀   已经闪过一些了还扣了黑马币
回复 使用道具 举报
于鸿鹏 发表于 2015-11-3 18:26
谢谢  我怕被删帖呀   已经闪过一些了还扣了黑马币

为啥啊,这不是挺好的吗
回复 使用道具 举报
xiaobei 发表于 2015-11-3 18:29
为啥啊,这不是挺好的吗

说是灌水呀加好友聊吧
回复 使用道具 举报
于鸿鹏 发表于 2015-11-3 18:26
谢谢  我怕被删帖呀   已经闪过一些了还扣了黑马币

我也被删了好多
回复 使用道具 举报
c9527 发表于 2015-11-3 19:37
我也被删了好多

以后就不要发了
回复 使用道具 举报
总结的不错
回复 使用道具 举报
特别感谢  谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马