指针和数组的关系
抛出结论:虽然数组和指针关系密切,好基友,但是数组绝不是指针,他们只是哥俩好而已!
先看第一个例子
#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课后作业
检测题
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