最近复习了一下大一的C语言,指针和数组这块感觉还是有必要整理整理,毕竟现在太健忘了
指针和一维数组间的关系
一旦给出数组的定义,编译系统就会为其在内存中分配固定的存储单元。数组元素在内存中是连续存放的,C语言中的数组名有特殊的含义,它代表存放数组元素的连续存储空间的首地址,即指向数组中第一个元素的常量指针。因此,数组元素既可用下标法也可用指针法来引用。
用下标法引用数组元素
#include<stdio.h>
int main()
{
int a[5], i;
for(i = 0; i < 5; i++)
scanf("%d", &a[i]);
for(i = 0; i < 5; i++)
printf("%d ", a[i]);
return 0;
}
这个程序也可以写成如下的形式:
#include<stdio.h>
int main()
{
int a[5], i;
for(i = 0; i < 5; i++)
scanf("%d", a + i); //这里a + i等价于&a[i]
for(i = 0; i < 5; i++)
printf("%d ", *(a + i)); //这里a + i等价于a[i]
return 0;
}
因为数组名 a
代表数组的首地址,即元素 a[0]
的地址( &a[0]
),所以表达式 a + 1
表示首地址后下一个元素的地址,即数组中的第2个元素即下标为1的元素 a[1]
的地址( &a[1]
),由此可知,表达式 a + i
代表数组中下表为 i
的元素 a[i]
的地址( &a[i]
)。
*a
表示取出首地址 a
所指的存储单元中的内容,即元素 a[0]
,*(a + i)
表示取出首地址元素后第 i
个元素的内容,即下标为 i
的元素 a[i]
。
指针运算的特殊性及其在访问数组元素中的作用
指针的 算术运算 和 关系运算 常常是针对数组元素而言的。
因为数组在内存中是连续存放的,所以指向同一数组中不同元素的两个指针的 关系运算 常用于比较它们所指元素在数组中的前后位置关系。
指针的 算术运算 则常用于移动指针的指向,使其指向数组中的其它元素。
如果定义一个指向整型数据的指针变量 p
,并使其值为数组 a
的首地址,那么通过这个指针变量 p
也可访问数组 a
的元素。
#include<stdio.h>
int main()
{
int a[5], *p;
for(p = a; p < a + 5; p++)
scanf("%d", p);
for(p = a; p < a + 5; p++)
printf("%d ", *p);
return 0;
}
p + 1
与 p++
本质上是两个不同的操作,虽然二者都对指针变量 p
进行加1运算,但 p + 1
并不改变当前指针的指向, p
仍然指向原来指向的元素,而 p++
相当于执行 p = p + 1
,因此, p++
操作改变了指针 p
的指向,表示将指针变量 p
向前移动一个元素位置,即指向了下一个元素。
指针也可用下标形式表示,采用指针的下标表示法:
#include<stdio.h>
int main()
{
int a[5], *p = NULL, i;
p = a; //p = a等价于p = &a[0]
for (i = 0; i < 5; i++)
{
scanf("%d", &p[i]); //&p[i]等价于p + i
}
p = a; //在再次循环开始前,确保指针P指向数组首地址
for (i = 0; i < 5; i++)
{
printf("%d ", p[i]); //p[i]等价于*(p + i)
}
return 0;
}
指针和二维数组间的关系
会有人继续研究这个吗?肯定有,但我就不写了,包括上面的,即使写这么多,即使指针是C语言的灵魂,我还是选择 下标法 ,哈哈