文章目录
1.数组指针
数组指针本质上是一个指针,这个指针指向一个数组
1.1 一维数组指针
int main(void)
{
char a[5]={'A','K','C','G','L'};
char (*p)[5]=&a;//&a代表的是整个数组的首地址
//char (*p)[5]=a;这样是错误的,因为a代表第一个元素的首地址
printf("%c %c %c",**p,*(*p+1),*(*p+3));//输出:A K G
return 0;
}
对于这行代码 char (*p)[5]=&a
,我们将它和char p[5]=&a
这行代码对比,两者之间只是相差了一个*
,而后者 &a
表示一个char数组,因此前者就表示一个指向char数组的指针(为何使用&a
而不直接用a
请参考这篇文章->文章地址)
1.1 二维数组指针
int main(void)
{
char a[3][4]={"for","cr","int"};
char (*p)[4]=NULL;
p=&a[0];
printf("%c %c %s %s\n",*(*p+1),*(*(p+1)+1),*p,*(p+1));//输出:o r for cr
return 0;
}
二维数组的传递有两种方式:一种是行指针传递,例如上面的代码(p=&a[0]
,p
指向了第一行的地址);一种是列指针传递。
- 在
char (*p)[4]=NULL;
这句代码中,p
指向一个容量为4的char数组,因此p+1
跨越的是一整个容量为4的char数组。 - 因为
+
的优先级大于*
,因此*p+1
等价于(*p)+1
,*p
表示第一个容量为4的char数组的中第一个元素的地址(第一行第一列数据的地址),(*p)+1
就表示第一个容量为4的char数组的第二个元素的地址(第一行第二列数据的地址),因此(*p)+1
表示跨越char数组内一个char元素的地址。 - 在上边的基础上再加上一个
*
就表示取对应地址下的数据了,也就是*(*p+1)
。 - 由上边的三条结论可知:
p+1
代表第二行的地址
*(p+1)
代表第二行第一个元素的地址
*(p+1)+1
代表第二行第二个元素的地址
2. 指针数组
指针数组本质上是一个数组,但是数组里保存的是指针。
2.1 创建指针数组
void print(char **arr)
{
puts(*arr);//输出:Fortran
puts(*(arr+1));//输出:C
}
int main(void)
{
char *p[]={"Fortran","C","C++"};
print(p);
return 0;
}
//如果一个指针数组大小不确定,则可以在指针数组的末尾设置NULL
char *a[]={"FORTRAN","C","C++",NULL};
void print(char *p[])
{
while(*p!=NULL)
{
puts(*p++);
}
}
上述代码中,由于[]
的优先级大于*
,因此a
先和[]
结合成 a[]
表示a为数组,然后 *
和char
结合,表示数组里的元素为char*
类型(char类型的指针)
3. 二维数组
3.1 定义二维数组
int a[3][4];
3.2 二维数组和指针的关系:
a | 代表a[0] 的地址,即:a=&a[0] ,a[0] 代表a[0][0] 的地址,即a[0]=&a[0][0] |
a+1 | 代表a[1] 的地址,即:a+1=&a[1] ,a[1] 代表a[1][0] 的地址,即a[1]=&a[1][0] |
a+2 | 代表a[2] 的地址,即:a+2=&a[2] ,a[2] 代表a[2][0] 的地址,即a[2]=&a[2][0] |
a[i][j]
=*(a[i]+j)
=*(*(a+i)+j)
=(*(a+i))[j]
3.3 用指针定义二维数组
3.3.1 用行指针定义并初始化二维数组
//定义
int (*p)[4]=NULL;
//初始化
p=a;
//或
p=&a[0];
//引用
p[i][j]
//或
*(p[i]+j)
//或
*(*(p+i)+j)
上述代码中定义了一个数组指针,可指向含有4个整型元素的指针变量。指向二维数组的行指针,它所指向的二维数组的每一行有4个元素,p代表第一行的地址。
3.3.2 用列指针定义并初始化二维数组
//定义
int *p=NULL;
//初始化
p=a[0];
//或
p=*a;
//或
p=&a[0][0];
//引用元素
*(p+i*n+j)
//或者
p[i*n+j]
上述代码将二维数组看成一个一维数组,具有m*n个元素,p代表第一行第一个元素的地址。
unordered_map<string, string > **map1;
map1 = new unordered_map<string, string >*[5];
4. 指向指针数组的指针变量
指向指针数组的指针变量将在下一篇文章中叙述