分类: C/C++
2011-04-10 00:59:28
指针变量的定义
在C程序中,存放地址的指针变量需专门定义;
int *ptr1;
float *ptr2;
char *ptr3;
表示定义了三个指针变量ptr1、ptr2、ptr3。ptr1可以指向一个整型变量, ptr2可以指向一个实型变量,ptr3可以指向一个字符型变量,换句话说, ptr1、ptr2、ptr3可以分别存放整型变量的地址、实型变量的地址、字符型变量的地址。
定义了指针变量,我们才可以写入指向某种数据类型的变量的地址,或者说是为指针变量赋初值:
int *ptr1,m= 3;
float *ptr2, f=4.5;
char *ptr3, ch='a';
ptr1 = & m ;
ptr2 = & f ;
ptr3 = & c h ;
上述赋值语句ptr1 = & m表示将变量m的地址赋给指针变量ptr1,此时ptr1就指向m。三条赋值语句产生的效果是ptr1指向m;ptr2指向f;ptr3指向ch 。用示意图6 - 3描述如下:
指针与一维数组
假设我们定义一个一维数组,该数组在内存会有系统分配的一个存储空间,其数组的名字就是数组在内存的首地址。若再定义一个指针变量,并将数组的首址传给指针变量,则该指针就指向了这个一维数组。我们说数组名是数组的首地址,也就是数组的指针。而定义的指针变量就是指向该数组的指针变量。对一维数组的引用,既可以用传统的数组元素的下标法,也可使用指针的表示方法。
inta[10],*ptr;/*定义数组与指针变量*/
做赋值操作:ptr=a;或ptr=&a[0];
则ptr就得到了数组的首址。其中,a是数组的首地址,&a[0]是数组元素a[0]的地址,指针变量ptr就是指向数组a的指针变量。
//以下标法输入输出数组各元素。
#include
main()
{
int n,a[10],*ptr=a;
for(n=0;n<=9;n++)
scanf("%d",&a[n]);//以空格间隔
printf("------output!\n");
for(n=0;n<=9;n++)
printf("%4d",a[n]);
printf("\n");
}
//采用指针变量表示的地址法输入输出数组各元素。
#include
main()
{
int n,a[10],*ptr=a;
for(n=0;n<=9;n++)
scanf("%d",ptr+n); //为什么不能是ptr++
printf("------output!\n");
for(n=0;n<=9;n++)
printf("%4d",*(ptr+n));//为什么不能是ptr++
printf("\n");
}
//利用指针法输入输出数组各元素。
#include
main()
{
int n,a[10],*ptr=a;
for(n=0;n<=9;n++)
scanf("%d",ptr++);
printf("------output!\n");
ptr=a;/*指针变量重新指向数组首址*/
for(n=0;n<=9;n++)
printf("%4d",*ptr++);
printf("\n");
}
在程序中要注意*ptr++所表示的含义。*ptr表示指针所指向的变量;ptr++表示指针所指向的变量地址加1个变量所占字节数,具体地说,若指向整型变量,则指针值加2,若指向实型,则加4,依此类推。而print f(“%4d”,*ptr++)中,*ptr++所起作用为先输出指针指向的变量的值,然后指针变量加1。循环结束后,指针变量指向如图6-6所示:
//采用数组名表示的地址法输入输出数组各元素。
#include
main()
{
int n,a[10],*ptr=a;
for(n=0;n<=9;n++)
scanf("%d",a+n);
printf("------output!\n");
for(n=0;n<=9;n++)
printf("%4d",*(a+n));
printf("\n");
}
//用指针表示的下标法输入输出数组各元素。
#include
main()
{
int n,a[10],*ptr=a;
for(n=0;n<=9;n++)
scanf("%d",&ptr[n]);
printf("------output!\n");
for(n=0;n<=9;n++)
printf("%4d",ptr[n]);
printf("\n");
}