C程序设计
----教学过程篇数组与指针指针变量可以指向数组元素,所谓数组元素的指针就是数组元素的地址。
引用数组元素可以用下标法来表示
(例如,array[10]),也可以用指针法,
即通过指向数组元素的指针找到所需要的元素。
数组与指针
指向数组元素的指针定义指向数组元素的指针变量和定义一个指向变量的指针变量方法相同例子:
int a[10];
int *p;
P=&a[0];
这样就将指针变量 P指向了数组 a的第一个元素数组与指针
注意:
C语言规定数组名不代表整个数组,
而是代表该数组的首地址,因此以下两个定义是等价的:
1.int *p=a;
2.int *p;
p=a[0];
数组与指针
通过指针引用数组元素假设 P已定义为一个指向整形数据的指针变量,并已经给它赋了一个整形数组元素的地址,使它指向某一个数组元素。
例如:
int *p,a[10];
p=&a[0];
*p=1;(引用整形指针 )
其作用相当于将数组元素 a[0]赋值为 1
数组与指针
关于指针引用数组元素的几点说明:
假设已经将指针变量 p指向了数组 a的 a[0]
则 p+I和 a+I就是 a[i]的地址。
即,*(p+I)=*(a+I)=a[i];
所以:引用数组元素的方法有四种
1.*(p+i)
2.*(a+i)
3.p[i]
4.*p;p++
指针法数组与指针(程序一)
#include <stdio.h>
#include <stdlib.h>
main()
{
int a[5],*p,i;
p=&a[0]; //p=a;
for(i=0;i<5;i++)
{
a[i]= i+1;
}
数组与指针(程序一)
for(i=0;i<5;i++)
{
printf("*(p+%d)=%d\n",i,*(p+i));
}
for(i=0;i<5;i++)
{
printf("*(a+%d)=%d\n",i,*(a+i));
}
for(;p<(a+5);p++)
{
数组与指针(程序一)
printf("*p=%d\n",*p);
}
for(p=a,i=0;i<5;i++)
{
printf("p[%d]=%d\n",i,p[i]);
}
system("pause");
}
数组与指针
对上述四种方法的比较:
1.*(p+i),*(a+i),p[i]三种方法的执行效率是完全一样的,每次要重新计算地址
2.用 *p;p++;来引用数组元素的方法执行效率最高,因为不必每次重新计算地址,
只需要有规律的改变地址值即可数组与指针
使用指针时,有几个问题要注意
1.可以改变指针变量的值,即可以执行 p++; 操作,但不可以改变指针常量的值,如数组名 a就是指针常量,所以不能用 a++。
例如,int a[10],i;
for(I=0;I<10;I++)
printf(“%d”,*a++);
上述写法是错误的数组与指针 (程序二 )
2.要注意指针变量的当前的值
#include <stdio.h>
#include <stdlib.h>
main()
{
int *p,a[10],i;
printf("please input 10 integers:\n");
for(p=a,i=0;i<10;p++,i++)
{
scanf("%d",p);
数组与指针 (程序二 )
}
//p=&a[0];
for(i=0;i<10;i++,p++)
{
printf("%3d",*p);
}
system("pause");
}
数组与指针
上述程序如果在两个 for循环之间加
p=&a[0];这句话,则输出的内容是乱码这是因为前一个 for循环已经将指针变量指向了数组中的最后一个元素,如果不将指针重新复位,使其重新指向数组的第一个元素,那么后一个 for循环的输出就指向了数组中 a[9]之后的元素,肯定是不正确的。
注意,C语言对这一类的错误在编译时是不会报错的数组与指针
3.指针运算的过程中应注意的问题
( 1),p++是指将指针变量当中的地址改变,使之变成当前数组元素的后一个元素的地址,即将指针指向下一个数组元素
( 2),*p++的作用是先输出 *p所指向的变量当中的值,然后再将 p++,使指针变量指向当前元素的后一个元素数组与指针
(3),(*p)++是指将 *p所指的元素中的值加一,但指针的指向并没有发生改变
( 4),*( ++p); 首先将指针指向当前元素的下一个元素,然后再取的指向改变后的元素的值例如,p=a;
*(++p); //得到的是 a[1]的值而 p=a;
*p++; // 得到的是 a[0]的值数组与指针
如果 p指向当前数组 a中的第 I个元素则有以下表述:
*(++p):表示第 I+1个数组元素的值
*p++:表示第 I个数组元素先被处理,然后再将指针指向第 I+1个数组元素
*p--和 *( --p) 类似于以上的加加运算,
只是表示将指针向数组前方移动数组与指针(程序三)
#include <stdio.h>
#include <stdlib.h>
#define N 10
main()
{
int a[N],i,*p1,*p2,*p,j,temp;
printf("please input %d numbers:\n",N);
for(p=a,i=0;i<N;i++,p++)
{
scanf("%d",p);
数组与指针(程序三)
}
for(j=0;j<N;j++)
{
for(p1=a,p2=a+1,i=0;i<N-j-1;i++,p1++,p2++)
{
if(*p1>*p2)
{
temp=*p1;
*p1=*p2;
*p2=temp;
数组与指针(程序三)
}
}
}
for(p=a,i=0;i<N;i++,p++)
{
printf("%3d",*p);
}
system("pause");
}