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

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

 

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;之类的
详见之前的 指针_基本概念里

 

 

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

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超自然祈祷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值