鱼C论坛

 找回密码
 立即注册
查看: 1533|回复: 1

[技术交流] 庆祝鱼c五周年,发个帖子 ,浅谈c语言指针的一点归纳

[复制链接]
发表于 2015-1-15 20:18:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 漠水 于 2015-1-15 20:30 编辑

看懂这个,指针应该就差不多搞定了吧。

一个变量分为两个方面存储变量数据的地址和地址里的值。
定义一个变量int a ;a 在计算机中本身被翻译的就是一个地址;
如                   变量a       地址 1000 地址里的值是0023
如int *b;       b=&a;       地址 1008 地址里的值是1000

指针本身就是一个变量,存储就是指向变量的地址      
      回调函数分为有参函数和无参函数,定义时的形参和调用时的实际参数是两个不同的变量
如同 int a;         形参                     地址     1000          存储的数值   1010
       int b;         实参                     地址     2000          存储的数值   1010
       a=b=10;   这就是函数参数的传递过程
而在函数调用时我们要改变实参的值则需要应用到指针,值传递时我们函数调用时在修改形参(1000)的值,
修改之后释放与实参(2000)无关;
而在函数中我们调用指针则如下
如同 int *a;         形参                     地址     1000          存储的数值   1008
       int *b;         实参                     地址     2000          存储的数值   1008
       int  c         b=&c                    地址     1008           存储的数值  2000

我们需要改变的都是地址1008里的值   

在函数调用中,我们常见调用结构体的类型有返回值和无返回值的,一般书本上
单链表中返回头指针head  ,利用回调函数中定义变量node* head,return head;
主函数中重新定义node *head;head=creat();来实现单链表的建立   

而二叉树无返回值,则需要用指针参数,而又因为二叉树中的申请结构体的需要调用到参数,
假定二叉树中指针参数: 实参地址1000    形参地址2000
形参指针变量申请结构体的话因为地址不同,结构体的也会改变
实参申请地址      1008——1020       形参申请地址2008——2020
所以我们需要用到二重指针来解决这个问题      
用到二重指针我们需要确定指针地址(形参实参地址不同)来确定利用指针申请的结构体的首地址
以下几个例子说明


  1. #include<stdio.h>

  2. //用int型变量改变地址
  3. void f1(int a)
  4. {
  5. a=a+10;
  6. }
  7. //令指针所指向的地址中的值改变
  8. void f2(int *a)
  9. {
  10. *a=20;

  11. }

  12. void main()
  13. {
  14. int k=10;
  15. int *a;
  16. a=&k;
  17. f1(k);
  18. printf("f1中a的值%d\n",k);        //没有变化,等于10
  19. f2(a);
  20. printf("f1中a的值%d\n",k);        //有变化,等于20

  21. }
复制代码


  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<conio.h>

  4. typedef struct node
  5. {
  6. int a;
  7. }node;

  8. //令指针所指向的地址中的值改变
  9. void f2(node *p)
  10. {
  11. p->a=20;
  12. }

  13. void main()
  14. {
  15. node p;                        //声明一个node结构变量p           自动分配了一个长度为node结构体的地址
  16. node *q;                //声明一个指向node结构变量的指针,若是指针需要用q=(node *)malloc(node)申请;
  17. p.a=10;                        
  18. printf("%d\n",p.a);   //查看p中的值
  19. q=&p;                        //令结构体指针q指向p
  20. f2(q);                        
  21. printf("%d\n",p.a);   //查看是否改变p中的值

  22. }
复制代码

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<conio.h>


  4. void f3(int *a)
  5. {
  6. printf("f3函数中的存储的数值为%d\n",a);
  7. printf("f3函数中的地址为%d\n",&a);
  8. }

  9. void main()
  10. {
  11. int *a;
  12. printf("主函数中的存储的数值为%d\n",a);
  13. printf("主函数中的地址为%d\n",&a);
  14. f3(a);

  15. }
复制代码


上例说明形参实参存储数值相同,地址不同

二叉树中为何要调用二重指针:
以下2个例子对比说明,指针申请位置不同p=(node *)malloc(sizeof(node)); 其余相同
一个申请在主函数,一个申请在回调函数中,结果回调函数中的形参申请的结构体因为地址与实参无关所以报错,
而在主函数中的结构体则不会。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<conio.h>

  4. typedef struct node
  5. {
  6. int a;

  7. }node;


  8. //令指针所指向的地址中的值改变
  9. void f2(node *p)
  10. {
  11. printf("f2函数中指针p的地址为%d\n",&p);   
  12. p=(node *)malloc(sizeof(node));
  13. p->a=20;
  14. }

  15. void main()
  16. {
  17. node *p;
  18. printf("主函数中指针p的地址为%d\n",&p);
  19. f2(p);               
  20. getch();
  21. printf("%d\n",p->a);   //查看是否改变p中的值
  22. }
复制代码

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<conio.h>

  4. typedef struct node
  5. {
  6. int a;

  7. }node;



  8. //令指针所指向的地址中的值改变
  9. void f2(node *p)
  10. {
  11. printf("f2函数中指针p的地址为%d\n",&p);
  12. p=(node *)malloc(sizeof(node));
  13. p->a=20;
  14. }

  15. void main()
  16. {
  17. node *p;
  18. printf("主函数中指针p的地址为%d\n",&p);
  19. p=(node *)malloc(sizeof(node));
  20. f2(p);               
  21. getch();
  22. printf("p->a的值为%d\n",p->a);   //查看是否改变p中的值
  23. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
拈花小仙 + 5 + 5 + 3 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-1-15 20:26:55 | 显示全部楼层
本帖最后由 漠水 于 2015-1-15 20:28 编辑

@拈花小仙   看来路漫漫其修远,越写越感觉好多好多要学的 :lol:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 13:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表