C语言程序设计(第6章指针)4

C语言程序设计(第6章指针)4,第1张

C语言程序设计(第6章指针)4,第2张

6.4指针和数组
变量在内存中存储时有地址,数组在内存中存储时也有地址。对于数组,数组名是数组在内存中的第一个地址。指针是用来存储变量的地址,可以指向变量,当然也可以指向数组的第一个地址或者数组元素的地址。也就是说指针变量可以指向数组或者数组元素。对于数组,指针变量也可以用于引用数组和数组元素。这里是指针和不同类型的数组。
6.4.1指针和一维数组
假设我们定义了一个一维数组,它在内存中会有一个系统分配的存储空,它的名字是数组在内存中的第一个地址。如果定义一个指针变量,并将数组的第一个地址传递给指针变量,指针将指向一维数组。我们说数组名是数组的第一个地址,也就是数组的指针。定义的指针变量是指向数组的指针变量。一维数组既可以被传统的数组元素下标方法引用,也可以被指针表示方法引用。
int a
指针变量的值在循环结束后指向数组尾部的后面。假设元素a[9]的地址是1000,整数占用2个字节,那么ptr的值就是100 ^ 2。请考虑以下程序段:
main ()
{
int n,a [10],* ptr = a;
for(n = 0;n scanf("%d ",ptr++);
printf("4 -输出!\ n ");
for(n = 0;n printf("M ",* ptr++);
printf(" \ n ");
}
与例6-9相比,程序只缺少赋值语句p t r = a;;程序运行结果还是一样吗?,* ptr/*定义数组和指针变量* /
进行赋值:ptr = a;或者ptr = & a[0];
然后ptr获取数组的第一个地址。其中a是数组的第一个地址,而&a[0]是数组元素a[0]的地址。因为A [0]的地址是数组的第一个地址,所以这两个赋值操作具有完全相同的效果。指针ptr是指向数组a的指针变量,
如果ptr指向一维数组,我们来看看C中指定的数组指针的表达式:
1) ptr+n和a+n表示数组元素a[n]的地址,即&a[n]。对于整个A数组,有10个元素,n的值为0 ~ 9,那么数组元素的地址可以表示为ptr+0~ptr+9或a+0~a+9,与& A [0] ~&A 一致。
2)知道数组元素的地址表示,*(ptr+n)和*(a+n)表示为数组的元素,相当于a[n]。
3)指向数组的指针变量也可以用数组的下标形式表示为ptr[n],其作用等价于*(ptr+n)。

[例6-5] /*用下面的符号输入和输出数组元素。
下面,从键盘输入10个数字,以数组的不同引用形式输出数组各元素的值。
# include
main()
{
int n,a[10],* ptr = a;
for(n = 0;n scanf("%d ",& a[n]);
printf("1 - output!\ n ");
for(n = 0;n printf("M ",a[n]);
printf(" \ n ");
}
运行程序:
1 2 3 4 5 6 7 8 9 0
1-输出!
1 2 3 4 5 6 7 8 9 0

【例6-6】输入输出数组的每个元素都是通过指针变量表示的地址方式输入的。
# include
main()
{
int n,a[10],* ptr = a;/*初始化指针变量*/
( n = 0;n scanf("%d ",ptr+n);
printf("2 -输出!\ n ");
for(n = 0;n printf(" M " ,*(ptr+n));
printf(" \ n ");
}
运行程序:
1 2 3 4 5 6 7 8 9 0
2-输出!
1 2 3 4 5 6 7 8 9 0

【例6-7】输入输出数组的每个元素都是通过数组名表示的地址方法输入的。
main( )
{
int n,a[10],* ptr = a;
for(n = 0;n < = 9;n ++)
scanf("%d ",a+n);
printf("3 -输出!\ n ");
for(n = 0;n printf(" M " ,*(a+n));
printf(" \ n ");
}
运行程序:
1 2 3 4 5 6 7 8 9 0
3-输出!
1 2 3 4 5 6 7 8 9 0

【例6-8】用指针表示的下标方法输入输出数组元素。
main( )
{
int n,a[10],* ptr = a;
for(n = 0;n scanf("%d ",& ptr[n]);
printf("4 -输出!\ n ");
for(n = 0;n printf("M ",ptr[n]);
printf(" \ n ");
}
运行程序:
1 2 3 4 5 6 7 8 9 0
4-输出!
1 2 3 4 5 6 7 8 9 0

【例6-9】输入输出数组元素
main ()
{
int n,a [10],* ptr = a;
for(n = 0;n scanf("%d ",ptr++);
printf("5 -输出!\ n ");
ptr = a;/*指针变量再次指向数组的第一个地址*/
for(n = 0;n printf("M ",* ptr++);
printf(" \ n ");
}
运行程序:
1 2 3 4 5 6 7 8 9 0
5-输出!
1 2 3 4 5 6 7 8 9 0
注意程序中*ptr++的含义。*ptr表示指针指向的变量;p t++表示指针指向的变量的地址加上一个变量占用的字节数。具体来说,如果指向整型变量,指针值就加2,如果指向实型,就加4,以此类推。在printf ("m ",*ptr++),* pt r++的作用是先输出指针指向的变量的值,然后给指针变量加1。循环结束后,指针变量指向如图6-6所示:

[9]

[10]

6.4.2指针和2D数组
定义一个2D数组:
int a[3][4];
表示二维数组有3行4列1 ^ 2个元素,按行存储在内存中。存储形式如图6-7所示:

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C语言程序设计(第6章指针)4

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情