C语言烧脑知识点:指针和二维数组,以及对应的行指针列指针

前言

临近期末,由于疫情,这学期C语言课,都是自学,所以走了不少弯路,但是同时也收获不少。这篇文章就当是做个C语言中比较难的知识点的总结。

一、为什么会有指针

在某些情况下,由于要保证原始数据的安全,不能对原始数据直接进行更改,但是还想要对数据进行排序,这个时候就需要用到指针了,我们只需要让一个变量指向那些数据,然后交换指向,这个时候就可以保证原始数据安全的情况下来排序

游戏外挂:在我的之前文章写过关于外挂的最基本原理,我们知道,应用程序如果要运行要加载到内存,但是我们没法直接进行修改,我们利用工具找到他的位置来进行修改。这个时候,我们在外挂中就是相当目标应用程序来调用另一个函数,这个时候就需要用指针了。

当然,指针的用处最大的意义在于,直接对物理层修改,这对于对硬件编程有很高的效率

指针和一维数组

数组名表示数组首地址的地址常量,并不代表整个数组。

虽然p和a的地址相同,但是用sizeof求大小的时候,a表示的是整个数组的大小.

指向元素指针和指向数组的指针

所以,虽然,a和a结果一样,但是当a的时候,指向的将是整个数组。所以说这个是a和a的不同

inta[5]={1,2,3,4,5};int*p=a;//指向元素的指针int(*pa)[5]=a;//指向数组的指针printf("%d,%d",sizeof(*p),sizeof(*pa));//输入结果:520
指针和二维数组

指针引用多维数组

(){inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};printf("%p%p%p",a,a+1,a+2);//分别表示第0,1,2行。//a是一个行指针,指向的数据的是一行有四个int型的数据。printf("%p%p%p",*a,*a+1,*a+2);//*a是指向第一行第一个元素的指针。printf("%p%p%p",*(a+1),*(a+1)+1,*(a+1)+2);//*(a+1)指向第二行第一个元素的地址printf("%p%p%p",*(*(a+1)+2));//取出第二行第三个元素的值。//a[i][j]=*(*(a+i)+j)a[i][j]=*(a+i)+j.//a[i]==*(a+i)a[i]==a+iprintf("%p%p%p",a,a+1,a+2);//代表某一行的首地址printf("%p%p%p",*a,*(a+1),*(a+2));//代表某一行第一列的首地址printf("%p%p%p",a[0],a[1],a[2]);//代表某一行第一列的首地址//指针指向的值与地址完全一样printf("%d,%p",*(a[1]+2),a[1]+2);printf("%d,%p",*(*(a+1)+2),*(a+1)+2);printf("%d%p",a[1][2],a[1][2]);//a[i][j]=*(a[i]+j)=*(*(a+i)+j)//a[i][j]=a[i]+j=*(a+i)+j}a[i][j]=*(a[i]+j)=*(*(a+i)+j)a[i][j]=a[i]+j=*(a+i)+ja[1]等价于*(a+1)都是指向列元素占四个字节a+1和a[1]地址相同,但是a+1指向行元素,而a[1]指向列元素。
总结:

a代表第0行首地址

a+i==a[i]代表地i行首地址

*(a+i):代表第0行首元素地址

*(a+i)+j==a[i][j]:代表第i行第j个元素

*(*(a+i)+j)==a[i][j]:代表第i行j个元素的值

二维数组名:第0行首地址

a+i:第i行首地址

想把首地址元素转换为首元素地址,加*:*(a+i)

想得到某个元素的地址,加上偏移量:*(a+i)+0==a[i][0]

想得到某个元素的值,是这个元素的地址基础上加*:*(*(a+i)+j)

好啦,可能有些烧脑,但是其实要理解,二维数组只是特殊的一维数组,例如二维数组inta[3][3];

其实只是有九个元素的一维数组,只不过把前三个化为一类,后三个化为一类。也可以看成是两个具有三个元素的一维数组,不过这两个一位数组的位置是连续的。

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐