*指针_函数指针、指针控制数组、链表(结构体指针)

来源:互联网 发布:项目经理考试软件app 编辑:程序博客网 时间:2024/05/22 14:02

指针的相关基本概念在之前的文章: 指针_基本概念 里讲过


r->(*r).
r->这种写法和(*r).是完全等效的,但是省去了两个字符。

strcpy((*r).name,"Leigh");

您可以像对待一个普通结构体变量那样对待*r,但在遇到C的操作符优先级问题时要小心。如果去掉*r两边的括号则代码将无法编译,因为“.”操作符的优先级高于“*”操作符。使用结构体指针时不断地输入括号是令人厌烦的,为此C语言引入了一种简记法达到相同的目的:

strcpy(r->name,"Leigh");


函数指针(指针*函数)

#include<stdio.h>void main(){int max(int, int);//两个函数的“引用性声明”int min(int, int);int(*p)(int, int);//p的类型用  int(*)(int int)表示//【定义指针名字p,可以存放int型返回值,且有2个int的形参的函数】int a, b, c, n;printf("输入两个要比较大小的值");scanf("%d%d", &a,&b);printf("请选择求1(最大值),2(最小值)");scanf("%d", &n);switch (n)//选择所要用到的函数{case 1: p = max; break;case 2: p = min; break;default:break;}c = (*p)(a, b);printf("相应结果:%d", c);}int max(int x, int y){return (x > y) ? x : y;}int min(int x, int y){return (x < y) ? x : y;}

P266:存储空间的起始地址(又称入口地址)称为这个函数的指针
函数像变量一样也可以用 函数名 或者 函数指针 变量来表示(详见 指针_基础概念)

意图:便于函数的“重载”(雾)


指针控制数组(指针*数组)

一维数组
#include<stdio.h>void main(){int a[5];//int *q;int *p = &a[0]; //此行及以下3行等价//int *p; p = &a[0][0]; //int *p = a;for (int i = 0; i < 5; i++)a[i] = i;for (int i = 0; i < 5; i++)printf("%d", a[i]);//下标法printf("\n");for (int i = 0; i < 5; i++)printf("%d", *(a+i));//数组名及元素符号计算元素地址/*for (int q = a; q < (a+5); q++)printf("%d", *q);//用指针指向当前数组元素=========不知道为啥,我的vs2017的编译器不给过= =。。。*/}
书上P232: a[i]就是*(a+i)

二维数组
#include<stdio.h>void main(){int a[5][5];//数组名a,就是数组的首地址,就是第一个元素(a[0][0])的地址,可以把这个地址让同类型的指针存起来for (int  i = 0; i < 5; i++){for (int j = 0; j < 5; j++){a[i][j] = i + j;printf("%d", a[i][j]);}printf("\n");}printf("下面是用指针引用的数组\n");for (int i = 0; i < 5; i++){for (int j = 0; j < 5; j++){*(*(a+i) + j) = i + j;//与上面等效,见书P246printf("%d", a[i][j]);}printf("\n");}}
书P246:
a[i]等价于*(a+i)
因此a[0]+1和*(a+0)+1都是&a[0][1]
故而*(a[0]+1)和*(*(a+0)+1)【或*(*a+1)】就是a[0][1]的值



链表【结构体指针】(指针*结构体)

指针既然什么同类型的地址都能存,那么用户做的结构体当然同类型的指针变量也能存了
#include<stdio.h>void main(){struct MyStruct{int num;struct MyStruct *Xiayige;//这就是嵌套定义了自己结构体类型的“下一个”指针};//定义在main函数里,只在main函数里有效struct MyStruct a, b;//类似于“int a,b;”struct MyStruct *head, *p;a.num = 1; b.num = 2;//我就建个静态链表……省事head = &a;a.Xiayige = &b;b.Xiayige = NULL;p = head;//用指针变量遍历访问链表do {printf("“下一个”结点地址:%d,当前节点所存的值%d\n", p->Xiayige, p->num);p = p->Xiayige;} while (p != NULL);}





多重指针(指针*指针)

例如:int **p;之类的
详见之前的 指针_基本概念里



其它的讲解指针的文章(解释(*p).与p->的文章):<http://blog.sina.com.cn/s/blog_60d3a48a0100yqcg.html



0 0
原创粉丝点击