c语言 (3 4) 6-1是真假,C语言程序设计(第6章指针)4

本文详细讲解了指针如何与一维数组交互,演示了通过指针访问数组元素的方法,包括指针加法表示数组元素地址,以及指针作为数组下标。同时,扩展到二维数组,介绍了其内存布局和指针操作。关键概念包括数组名与首地址、指针与数组元素的关联。
摘要由CSDN通过智能技术生成

4335ad4cd3fb1bc16edd3bbc6dc2948a.png

6.4 指针与数组

变量在内存存放是有地址的,数组在内存存放也同样具有地址。对数组来说,数组名就是数组在内存安放的首地址。指针变量是用于存放变量的地址,可以指向变量,当然也可存放数组的首址或数组元素的地址,这就是说,指针变量可以指向数组或数组元素,对数组而言,数组和数组元素的引用,也同样可以使用指针变量。下面就分别介绍指针与不同类型的数组。

6.4.1 指针与一维数组

假设我们定义一个一维数组,该数组在内存会有系统分配的一个存储空间,其数组的名字就是数组在内存的首地址。若再定义一个指针变量,并将数组的首址传给指针变量,则该指针就指向了这个一维数组。我们说数组名是数组的首地址,也就是数组的指针。而定义的指针变量就是指向该数组的指针变量。对一维数组的引用,既可以用传统的数组元素的下标法,也可使用指针的表示方法。

int a[10] , *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[9]保持一致。

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<=9; n++)

scanf("%d" , &a[n]);

printf("1------output! \n");

for(n = 0; n<=9; n++)

printf("M", a[n]);

printf("\n");

}

运行程序:

1 2 3 4 5 6 7 8 9 0

1------output!

1 2 3 4 5 6 7 8 9 0

[例6-6] 采用指针变量表示的地址法输入输出数组各元素。

#include

main( )

{

int n,a[10],*ptr=a; / *定义时对指针变量初始化* /

for(n = 0; n<=9; n++)

scanf("%d", ptr + n);

printf("2------output! \n");

for(n=0; n<=9; n++)

printf("M", *(ptr+n));

printf("\n");

}

运行程序:

1 2 3 4 5 6 7 8 9 0

2------output!

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------output! \n");

for(n = 0; n<=9; n++)

printf("M", *(a+n));

printf("\n");

}

运行程序:

1 2 3 4 5 6 7 8 9 0

3------output!

1 2 3 4 5 6 7 8 9 0

[例6-8] 用指针表示的下标法输入输出数组各元素。

main( )

{

int n,a[10],*ptr=a;

for(n = 0; n<=9; n++)

scanf("%d", &ptr[n]);

printf("4------output! \n");

for(n = 0; n<=9; n++)

printf("M", ptr[n]);

printf("\n");

}

运行程序:

1 2 3 4 5 6 7 8 9 0

4----output!

1 2 3 4 5 6 7 8 9 0

[例6-9] 利用指针法输入输出数组各元素

main( )

{

int n,a[10],*ptr=a;

for(n = 0; n<=9; n++)

scanf("%d", ptr++);

printf("5------output! \n");

ptr = a; / *指针变量重新指向数组首址* /

for(n = 0; n<=9; n++)

printf("M", *ptr++);

printf("\n");

}

运行程序:

1 2 3 4 5 6 7 8 9 0

5-----output!

1 2 3 4 5 6 7 8 9 0

在程序中要注意*ptr++所表示的含义。*ptr表示指针所指向的变量; ptr++表示指针所指向的变量地址加1个变量所占字节数,具体地说,若指向整型变量,则指针值加2,若指向实型,则加4,依此类推。而printf(“M”, *ptr+ +)中,*ptr++所起作用为先输出指针指向的变量的值,然后指针变量加1。循环结束后,指针变量指向如图6 - 6所示:

指针变量的值在循环结束后,指向数组的尾部的后面。假设元素a[9]的地址为1000,整型占2字节,则ptr的值就为100 2。请思考下面的程序段:

main( )

{

int n,a[10],*ptr=a;

for(n = 0; n<=9; n++)

scanf("%d", ptr++);

printf("4------output! \n");

for(n = 0; n<=9; n++)

printf("M", *ptr++);

printf("\n");

}

程序与例6 - 9相比,只少了赋值语句p t r = a;程序的运行结果还相同吗?

6.4.2 指针与二维数组

定义一个二维数组:

int a[3][4];

表示二维数组有三行四列共1 2个元素,在内存中按行存放,存放形式为图6 - 7:

2829f2ca24f0d0090cbba57f30759f23.png

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

下载Word文档到电脑,方便收藏和打印[全文共2117字]

编辑推荐:

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

下载Word文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值