您的位置:首页 > 编程语言 > C语言/C++

C语言中的指针和数组

2017-11-20 22:30 148 查看
    指针和数组关系密切。不带下标的数组名实际上就是指向数组第一个元素的指针。char p[0],以下两句完全等价:p, &p[0]。换言之,也就是:p == &p[0]为真,因为数组第一元素的地址也就是数组的地址。观察下面程序,p1和p2实际指向同一个内存地址。

#include <stdio.h>

int main(int argc, char *argv[])
{
int a[]={1,3,5,7,9};
int *p1=a;
int *p2=&a[0];

printf("*p1: %u\n",p1);
printf("*p2: %u\n",p2);
return 0;
}



    在指向某数组元素的指针上加或减去一个整数,就可以指向另一个数组元素,但不能越界,即超出该数组的范围。在指针上进行的加减运算,必须指向同一个数组,或数组存储空间的下一个单元。比如p=a+10是非法的,因为a只有5个元素。而p=a+5,虽然a的元素是a[0]-a[4],但p可以指向数组存储空间的下一个单元。

    引用数组元素,既可以用下标的方式,即a[i],也可以用指针的方式,即*(a+i)或*p。

    没有下标的数组名称为指针,反之,任何指针变量也可以取下标,就像变量声明成数组一样。例如:

int *p, i[10];
p=i;
i[5]=100;        //用数组名加下标赋值
p[5]=100;        //用指针加下标赋值
*(p+5)=100;        //用指针运算赋值


    上述3个赋值语句等价,都将100这个值赋到数组第6个元素中。其中第二种是对p进行下标操作,第3句是使用指针运算。

    C语言提供访问数组有两种方法:指针运算和数组下标。程序中经常通过指针运算存取数组,原因在于指针运算一般快于数组下标。因为程序设计中常常考虑速度因素,C程序员一般都用指针访问数组元素。

//以不同的方式输出数组的所有元素的值
#include <stdio.h>

int main(int argc, char *argv[])
{
int a[10],i,*p=NULL;

for(i=0;i<10;i++)
a[i]=i;
//第一种:引用数组下标
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");

//第二种:借助数组首元素构造的指针
for(i=0;i<10;i++)
printf("%d ",*(a+i);
printf("\n");

//第三种:指针
for(p=a;p<a+10;)
printf("%d ",*p++);
printf("\n");

return 0;
}


    *p++等价于*(p++)。也即先得到p所指向的变量值(*p),再使p=p+1。也就是说,先取得当前p所指向的变量值,再使p指向下一个变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C