C语言解惑4.5

一维数组与指针的关系:

1.使用一维数组名简化操作

1 #include<stdio.h>
2 void main()
3 {
4     int i,a[5],b[5];
5     int *p;
6     for(i=0;i<5;i++)
7             scanf("%d%d",a+i,&b[i]);//a+i直接进行地址的指向,而&则为取下标为i的b数组的地址,两者等效,只不过前一种方法不用再&符号.

然后这里有一个问题:那a[i]=i[a]吗?

根据C99,编译器在内部使用指针算法来访问数组元素。例如:a[8]=*(a+8),那么根据加法交换性,*(a+8)=*(8+a)=8[a]

2.使用指针操作一维数值数组

任何能由数组下标完成的操作,都可以借用指针来实现,借助指针的自增自减运算简化操作,使用指向数组的指针有助于产生占用存储空间小,运行速度快的高质量的代码,但要注意指针的越界问题!

//接着上面的代码
p=a;
for(i=0;i<5;i++)
    printf("%d ",*(p+i));//*(p+i)==p[i]==*(a+i)==a[i]
//地址的变换
while(p<a+5)
{
  printf("%d ",*p);
   p++;
}
//此时p=a+5,要想p进行正常的操作,需要p重新指向一个已知的地址!
p=&a[2];//这里p[0]=a[2];
for(i=0;i<3;i++)
            printf("%d %d",p[2+i],p[2-i]);//分别是a[2],a[2],a[3],a[1],a[4],a[0]

3.使用一维字符数组

一维字符数组就是字符串!

 1 #include<stdio.h>
 2 void main()
 3 {
 4     int a[[]={1,2,3,4,5},*p,i;
 5     char c[]="abcde",*cp;
 6     p=&a[2];
 7     cp=&c[2];
 8     for(i=0;i<3;++i)
 9         printf("%d%c%d%c",*(p+i),*(cp+i),*(p-i),*(cp-i));
10     priintf("\n%d%s%c\n",*p,*cp,cp);

编译无错,但产生运行错误(代码第十行),*cp代表一个字符要使用%c,而cp是存储字符串的首地址,所以将输出从cp指向的地址开始的字符串,需要用%s格式,将它改为

扫描二维码关注公众号,回复: 6353316 查看本文章

printf("\n%d%c%s\n",*p,*cp,cp);

字符串的问题请注意结束位‘\0’

猜你喜欢

转载自www.cnblogs.com/CCZDA/p/10977303.html
4.5