龙空技术网

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

喵喵视角 57

前言:

此刻各位老铁们对“c语言指针与一维数组”大体比较着重,咱们都想要学习一些“c语言指针与一维数组”的相关资讯。那么小编同时在网上网罗了一些对于“c语言指针与一维数组””的相关知识,希望你们能喜欢,各位老铁们一起来学习一下吧!

前言

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

一、为什么会有指针在某些情况下,由于要保证原始数据的安全,不能对原始数据直接进行更改,但是还想要对数据进行排序,这个时候就需要用到指针了,我们只需要让一个变量指向那些数据,然后交换指向,这个时候就可以保证原始数据安全的情况下来排序游戏外挂: 在我的之前文章写过关于外挂的最基本原理,我们知道,应用程序如果要运行要加载到内存,但是我们没法直接进行修改,我们利用工具找到他的位置来进行修改。这个时候,我们在外挂中就是相当目标应用程序来调用另一个函数,这个时候就需要用指针了。当然,指针的用处最大的意义在于,直接对物理层修改,这对于对硬件编程有很高的效率指针和一维数组

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

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

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

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

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

指针引用多维数组

#include <stdio.h> int main () {   int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} ;  printf("%p,%p,%p"a,&a,*a); }printf ("%d,%d ,%d",sizeof(*a),sizeof(*(&a)) ,sizeof(**a));//a是行指针指向一个有四个元素的数组 16 //&a是一个指二维数组的指针,二维数组有12个元素 48//  *a是一个指向int 类型数据的指针 4

分析: a代表行元素,指向四个字节,所以大小是4*4=16, &a代表整个二维数组,所以*&a就是12*4= 48 *a代表一个指向int 数据类型的指针

#include <stdio.h>int main() {   int a[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+i   printf ("%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 )

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

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

标签: #c语言指针与一维数组 #如何让一个数组指针指向一个二维数组 #c语言二维数组行和列 #指针函数输出一维数组的值 #指针函数输出一维数组的值是什么类型