指针的相关基本概念在之前的文章: 指针_基本概念 里讲过
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;//与上面等效,见书P246
printf("%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;之类的
详见之前的 指针_基本概念里