2022-2023-1 20221314《计算机基础与程序设计》第十二周学习总结

2022-2023-1 20221314《计算机基础与程序设计》第十二周学习总结

作业信息

班级链接:https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP
作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK11
作业目标:学习《C语言程序设计》第11章
作业正文:https://i.cnblogs.com/posts/edit;postId=16906071

教材学习内容总结

《C语言程序设计》第11章

指针与一维数组间的关系,

指针与二维数组间的关系

向函数传递一维数组和二维数组

指针数组,命令行参数

动态数组,动态内存分配、

 问题:对定义不是太清晰,两者之间的关系也有些模糊。

解决方法:上网查阅资料。

数组指针

计算机编程术语
数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。
中文名
数组指针
外文名
array pointer
运用领域
计算机编程
源    于
编程语言,如c,c++
本    质
指针

本质与区别

数组指针是指向数组地址的指针,其本质为指针;
指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。
数组指针的使用在某些情况下与指针数组很相似,要注意区别。

二维数组指针

为了能更好地理解数组指针,与普通指针及二级指针的区别,下面举例说明一下。
例如:
1
2
3
4
{
 int a[4][5];
    int (*p)[5]=a;
}
这里a是个二维数组的数组名,相当于一个二级指针常量;//二维数组名与二级指针毫无关系(初学者常常混淆)。
p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;
p+i是一维数组a[i]的地址,即p+i==&a[i];对该式两边作取内容运算(*)得*(p+i)==a[i],由于二维数组中a[i]==&a[i][0],则*(p+i)表示a[i][0]的地址,即*(p+i)==&a[i][0];
*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。
//(*p)[5]其中的5换成其他的数字在vc++6.0环境中都无法通过编译
(*p)[5]其中的5在上述例子中没有表示任何意思你可以换成除0以外的整数,[5]的作用就是帮助你记忆说你所指向的一维数组的长度。(不过除了与定义的二维数组的长度一致的不会警告之外 )其他的数会警告但是不影响结果。

相关区别

一、指向一维数组的指针变量设一维数组为a[n]
定义方法:*指针变量名即*P
这个p一般指向的一维数组的首地址,即p=a,或者p=&a[0];p,a,&a[0]均指向同一单元,它们是数组a的首地址,也是0号元素a[0]的首地址。p+1,a+1,&a[1]均指向1号元素a[1]。类推可知p+i,a+i,&a[i]。
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
main()
{
    int a[5],i,*pa;
    pa=a;
    for(i=0;i<5;i++)
    {
        *pa=i;
        pa++;
    }
    pa=a;
    for(i=0;i<5;i++)
    {
        printf("a[%d]=%d\n",i,*pa);
        pa++;
    }
}
二、指向二维数组的指针变量设二维数组为a[m][n]
定义方法:(*指针变量名)[长度]即(*P)[n]
“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。
1、多维数组有关概念
注意a[0],a[1],a[2]表示的都是对应那行的数组首地址,和数组名,而不是一个元素
多维数组地址的表示方法
设有整型二维数组a[3][4]如下:
1
2
3
1000 1001 1002 1003
1004 1005 1006 1007
1008 1009 1010 1011
设数组a的首地址为1000,各下标变量的首地址及其值。在第四章中介绍过,C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a[0],a[1],a[2]。每一个一维数组又含有四个元素。例如a[0]数组,含有a[0][0],a[0][1],a[0][2],a[0][3]四个元素。数组及数组元素的地址表示如下:a是二维数组名,也是二维数组0行的首地址,等于1000。a[0]是第一个一维数组的数组名和首地址,因此也为1000。*(a+0)或*a是与a[0]等效的,它表示一维数组a[0]0号元素的首地址。也为1000。&a[0][0]是二维数组a的0行0列元素首地址,同样是1000。因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。同理,a+1是二维数组1行的首地址,等于1004。a[1]是第二个一维数组的数组名和首地址,因此也为1004。&a[1][0]是二维数组a的1行0列元素地址,也是1004。因此a+1,a[1],*(a+1),&a[1][0]是等同的。由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。此外,&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。
C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&a[i],*(a+i)和a+i也都是等同的。另外,a[0]也可以看成是a[0]+0是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的1号元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]。由a[i]=*(a+i)得a[i]+j=*(a+i)+j,由于*(a+i)+j是二维数组a的i行j列元素的首地址。该元素的值等于*(*(a+i)+j)。

举例

数组指针:
1
2
3
4
5
6
7
8
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
p=(int(*)[4])a;
for(int i=0;i<3;i++)
{
    for(int j=0;j<4;j++) printf("%d",p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j)
    printf("\n");
}
指针数组:
1
2
3
4
5
6
7
8
9
10
11
12
13
int ix=0;
int i=0,j=0;
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p[3];
for(ix;ix<3;ix++) p[ix]=a[ix];
for(i;i<3;i++)
{
    for(j=0;j<4;j++)//注意这里的j要赋值等于0,要不然只能输出第一行1234,达不到预期的效果
    {
        printf("%d",p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j)
    }
    printf("\n");
}

 错题:无

 

学习进度条

 

  代码行数(新增/累计) 博客量(新增/累计) 学习时间(新增/累计) 重要成长
目标  2000  50  500  
第一周   120 2/2  20  
第二周  120 2/4  20  
第三周 140 1/5

20

 
第四周 200 2/7

20

 
第五周 200 1/8

20

 
第六周 300 1/9

20

 
第七周 300 1/10

20

 
第八周 300 3/13

20

 
第九周 300 1/14

20

 
第十周 300 1/15

20

 
第十一周 300 2/17

20

 
第十二周 300 3/18

20

 
 计划学习:20小时
实际学习:20小时
 
posted @ 2022-11-19 14:42  詹全晨  阅读(14)  评论(0编辑  收藏  举报