【C语言补漏】 指针和数组

指针和数组的关系

抛出结论:虽然数组和指针关系密切,好基友,但是数组绝不是指针,他们只是哥俩好而已!

先看第一个例子

#include<stdio.h>

void main()
{
	int a;
	int *p = &a;
	printf("请输入一个整数:");
	scanf("%d", &a);

	printf("a = %d\n", a);

	printf("请重新输入一个整数:");
	scanf("%d", p);//这里的p就是整型变量a 地址,相当于&a
	printf("a = %d\n", a);

}

运行结果:

请输入一个整数:123
a = 123
请重新输入一个整数:321
a = 321
请按任意键继续. . .

再看下面的程序,和上面的进行比较。

#include<stdio.h>

void main()
{
	char str[128];//数组在定义时,必须初始化大小
	printf("请输入博客的地址:");
	scanf("%s", str);

	printf("我的博客的地址是:%s\n", str);
	
	printf("str 的地址是:%p\n", str);
	printf("str 的地址是:%p\n", &str[0]);

}

运行结果:

请输入博客的地址:https://blog.csdn.net/plSong_CSDN
我的博客的地址是:https://blog.csdn.net/plSong_CSDN
str 的地址是:0000002881D4FC80
str 的地址是:0000002881D4FC80
请按任意键继续. . .

比较上面的代码,可以说明:数组名,其实就是第一个元素的地址;

指向数组的指针

定义一个指针指向数组

char a[123];
char *p;
p = a;//语句1
p = &a[0];//语句2

上面语句1和语句2是相同的。

指针的运算

当指针指向数组元素的时候,我们可以对指针变量进行加减运算(n),这样做的意义相当于指向距离指针所在位置向前或向后地n个元素。

看下面的例子:

#include<stdio.h>

void main()
{
	int num[5] = {1,2,3,4,5};
	int *p = num;
	int i;
	printf("使用定义的数组指针:\n");
	for (i = 0; i <= 4; i++)
	{
		printf("num[%d]= %d\n", i,*(num + i));
	}

	printf("使用数组名:\n");
	for (i = 0; i <= 4; i++)
	{
		printf("num[%d]= %d\n", i, *(p + i));		
	}
}

运行结果:

使用定义的数组指针:
num[0]= 1
num[1]= 2
num[2]= 3
num[3]= 4
num[4]= 5
使用数组名:
num[0]= 1
num[1]= 2
num[2]= 3
num[3]= 4
num[4]= 5
请按任意键继续. . .

对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法;

需要强调的是:

1)p+1并不是简单地将地址加1,而是指向数组的下一个元素。

2)由于数组名就是指针,所以,可以之间使用数组名进行访问。


鱼C论坛《带你学C带你飞》S1E22课后作业

https://fishc.com.cn/forum.php?mod=viewthread&tid=72205&extra=page%3D1%26filter%3Dtypeid%26typeid%3D570

检测题

0.str[3] 用指针法怎么表示?

答:*(str+3)

1. 假设整型指针变量 p 存放的地址值是 0x11008888,那么请问 p + 1,p + 2,p + 4 和 p + 8 的地址分别是?

p + 1 == 0x11008888 + 4 == 0x1100888C
p + 2 == 0x11008888 + 8 == 0x11008890
p + 4 == 0x11008888 + 16 == 0x11008898
p + 8 == 0x11008888 + 32 == 0x110088A8

2. 请问 str[20] 是否可以写成 20[str]?

答:居然可以,

因为在访问数组的元素的时候,数组名被解释为数组第一个元素的地址。

所以 str[20] == *(str + 20) == *(20 + str) == [20]str


★finished by songpl,2018.12.28

猜你喜欢

转载自blog.csdn.net/plSong_CSDN/article/details/85317289