11.29C语言学习笔记(指针与二维数组)
接11.18学习笔记https://blog.csdn.net/FriedReich/article/details/121402242
指针访问一维数组
#include<stdio.h>
int main()
{
int a[3]={1,3,5};
printf("%p\n",a);
printf("%p\n",a+1);
printf("%p\n",&a);//此处赋予的是一个数组的常量地址,所以说printf行1的结果和行3的结果没有变化。
printf("%p\n",&a+1);//这是一个有三个元素的数组,占位12个字节,所以当这个常量地址往后增加一个单位的之后,所显示的指针变量往后增加12个单位。
printf("%p\n",*(&a));//该数组常量地址所对应的指针变量 这里可以理解为两符号相消
printf("%p\n",*(&a)+1);
return 0;
}
指针访问二维数组
1、访问按行优先,所以有限定义列数。
第一种访问方式类似与一维数组 (指针变量p)
二维数组访问方式:
定义了二维数组 a[][]
数组名a对应的是第一行的首地址。
a每次后移一个单位,对应为下一行的首地址。
a[0][0] | p | a |
---|---|---|
a[0][1] | p+1 | |
a[1][0] | p+2 | a+1 |
a[1][1] | p+3 | |
a[2][0] | p+4 | a+2 |
a[2][1] | p+5 |
#include<stdio.h>
int main()
{
int i;
int a[3][2]={1,2,3,4,5,6};
for(i=0;i<6;i++)
{
printf("%p\t%p\n",a+i,a+i+1);
}
return 0;
}
指针与二维数组
恒等表达式:
指向每一行第一个元素的值:
*(a+i)=a[i]
(都为a数组第i行的首地址)
推导:
*(a+i)+j=a[i]+j
(都为a数组第i行第j列的首地址)
口诀:行地址变列地址加“*”;列地址转行地址加“&”
实例:
1、传统一维数组的访问:
#include<stdio.h>
int main()
{
int a[3][2];
int i;
int *p=&a[0][0];
for(i=0;i<3;i++)
{
printf("%p\t%p\n",p+i,p+i+1);
printf("%d\t%d\n",*(p+i),*(p+i+1));//此处若将p换成a,系统识别的数据类型就会出现差错
//一般的,还是负值一个单独的指针变量,以便访问
}
return 0;
}
行指针的定义
类型标识指示符(*指针变量名)[整形常量表达式];
例如: int(*p)[3]
定义了指针变量p,指向了一个长度为3的一维数组。
(对于二维数组而言,定义的指针变量p所指向的数组元素应与该二维数组的列数相同。)
#include<stdio.h>
int main()
{
int a[3][2]={1,2,3,4,5,6};
int i,j;
int (*p)[2];//此处指针变量p指向了一个长度为2的数组
p=a;//p和a等价后,p+i与a+i都等价于往后增i行
//此时p[i]等价于a[i]
//p[i][j]等价于a[i][j]
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
printf("%p\t%d\n",p[i]+j,p[i][j]);
}
}
return 0;
}
#include<stdio.h>
int main()
{
int a[3][2] = { 1,2,3,4,5,6 };
int(*p)[2];
p = a;
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 2; j++)
{
printf("%p\t%d\n", *(a + i) + j, a[i][j]);
printf("%p\t%d\n", a[i] + j, a[i][j]);
printf("%p\t%d\n", p[i] + j, a[i][j]);
}
printf("\n");
}
return 0;
}
指针数组
(先定义地址再对标相应的值)
类型标识符*指针变量名[整型变量表达式];
例如 int *a[5]
;
a[0]
…a[4]
都是类型为int的指针变量
举例 利用指针数组访问二维数组
int main()
{
int a[3][2]={1,2,3,4,5,6};
int i,j;
int *p[3];
for(i=0;i<3;i++)
{
p[i]=a[i];
for(j=0;j<2;j++)
{
printf("%p\t%d\n",p[i]+j,p[i][j]);
}
return 0;
}
指针数组与行指针定义的区别
行指针定义 例如: int(*p)[3]
旨在用指针p指向一个长度为3个单位的数组,
运用于二维数组的时候指针p赋值为已定义的二维数组名,即指针p控制的是行,所指向的数组控制的是列。
指针数组 例如 int *a[5]
旨在定义一个数组类型的指针,该组中每一个元素对应地址,
一般的,定义的指针数组元素对标的是所需赋值数组的行首地址。