都说指针是C语言的精华所在。今天继续对指针的探索!
指针下
一、指针数组、数组指针
指针数组:是存放指针的数组。 如 int *p[5]; 该数组长度为5,存放的是指向整型变量的指针。
数组指针:是一个指向数组的指针。 如 int (*p)[5]; 这是一个指向长度为5的整型数组的指针。
1.数组指针在一维数组中的应用
int a[5]={0};
a;//表示数组首元素的地址 &a;//表示数组的地址 虽然它俩取值相同,但是意义却不同。
因此可以有: int (*p1)[5]; p1=&a;//ok p1=a;//error!
int p2; p2=&a;//error! p2=a;//ok
p1=&a;//表示的是一个指向数组长度为5的数组 的指针。
p2=a;//表示的是指向了一个数组的首地址,也就是一个元素的地址。
所以我们在使用时一定要搞清楚,我们想要的是一个元素的地址,还是一个数组的地址。
2.如何用数组指针获取一维数组的元素?
(*p1)[i]==a[i];
数组指针(*p1)可以替换数组名 a进行工作。区别在于,一维数组名a相当于一个一级指针常量。而p1是一个指针
变量。因此a不可变,而p1不仅可以指向数组a,还可以指向其它满足要求的数组。(已在vc++6.0环境下验证)
编码验证:
#include <stdui.h>
int main()
{
int a[5]={0};
//验证a 与 &a的取值相同
printf("%p\n",a);
printf("%p\n",&a);
//验证 a 与 &a 虽然取值相同但是意义不同。
int (*p1)[5];
p1=a;//会报错
p1=&a;
int *p2;
p2=&a;//会报错
p2=a;
//验证数组指针在一维数组中使用方式 (*p1)[i]==a[i];
for(int i=0;i<5;i++)
{
(*p1)[i]=5;//== a[i]=5;
}
for(i=0;i<5;i++)
{
printf("%d ",a[i]);//5 5 5 5 5
}
printf("\n");
//验证数组指针为变量,可以被再次赋值。
int b[5]={0};
p1=&b;
for(i=0;i<5;i++)//数组指针p1被再次赋值后,对原先被指的数组无影响。
{
printf("%d ",a[i]);// 5 5 5 5 5
}
printf("\n");
for(i=0;i<5;i++)
{
printf("%d ",(*p1)[i]);// 0 0 0 0 0
}
printf("\n");
return 0;
}
3.数组指针在二维数组中的应用
int a[3][4]={0};
int (*p)[4]; p=a; //将二维数组中的第一个一维数组的地址赋值给p 即此时p=a[0];也就是第一行元素的地址
这里a是一个二维数组的数组名,相当于一个二级指针常量;
p是一个指针变量,它指向一个包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;
也就是说,此时由 p=a;则p此时指向的是a[0]的地址(第一行的地址),当p+1时,指向的是a[1]的地址(第二行的地
址)即当p+-整数的时候,是以它指向的一维数组的长度为单位发生移动的。
用数组指针获取二维数组元素:
*(p+i)是一维数组a[i][0]的地址;
*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。
二、数组指针数组:用来存储数组指针的数组 (了解就好,感觉自己理解的还并不够彻底!)
如:int (*parr[3])[4];
表示:(parr[i])[4]中存储的是一个 长度为4的一维数组的地址。 parr[i][0]相当于该一维数组地址的首地址
用*(parr[i][0]+j)来获取二维数组中的元素值
编码示例:
#include<stdio.h>
int main()
{
int a[3][4]={0};
//定义 数组指针数组 parr
int (*parr[3])[4];
int i,j;
//给 parr数组赋值。
for(i=0;i<3;i++)
{
parr[i]=&a[i];
}
//用数组指针数组 parr 改变被指向的二维数组内的值 *(parr[i][0]+j
for(i=0;i<3;i++)
{
for( j=0;j<4;j++)
{
*(parr[i][0]+j)=3;
}
}
//验证上述操作是否有效。输出应为3*4的矩阵且 值全为3
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
后续 指针3
以上内容是全由个人对现阶段所学知识进行的总结整理,如果有任何问题欢迎指出!谢谢。