MENU

指针和数组

April 24, 2019 • Read: 272 • Codes

最近复习了一下大一的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 + 1p++ 本质上是两个不同的操作,虽然二者都对指针变量 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语言的灵魂,我还是选择 下标法 ,哈哈

Archives QR Code Tip
QR Code for this page
Tipping QR Code