指针数组和数组指针区别,已在前文中提到过,这里通过举例进一步分析
1、数组指针
数组名取地址的情况已经在该文中说明。
char ch[6] = "hello";
char (*str)[6] = &ch;
数组名取地址后,表示指向这个数组的指针,值仍是第1个元素的地址。
数组名取地址后再解引用,表示的是这个数组本身,用数组的首元素地址标识数组,故值仍是第1个元素的地址。
也就是说,*str == *(&ch)==ch;
1)数组指针指向一维数组的情况:
char ch[6] = "hello";
char (*str)[6] = &ch;
如上,1)&ch+1,移动了6个字节单元;ch+1移动了一个字节;
2)ch和&ch值在 值 上是相等的,都等于首元素的地址。
3)*ch与ch[0]等价;*&ch与ch等价;
所以,*str 与ch是等价的!
int main()
{
char ch[6] = "hello";
char (*str)[6] = &ch;//数组名取地址表示一个指向整个数组的指针
printf("%p\n", ch); //数组名指向的是第1个元素的首地址,即ch[0]的地址
printf("%p\n", str); //输出数组ch的地址,此地址与ch[0]地址相同
printf("%c\n", *ch); //输出的是ch[0]的值
printf("%c\n", ch[0]); //输出的是ch[0]的值
printf("%c\n", *(ch+1)); //输出的是ch[1]的值
printf("%c\n", ch[1]); //输出的是ch[1]的值
printf("%p\n", *str); //与ch等价,是ch[0]的地址
printf("%c\n", (*str)[0]); //ch[0]的值
printf("%c\n", (*str)[1]); //ch[1]的值
printf("%c\n", **str); //与ch[0]等价
printf("%c\n", *str[0]); //str[0]是与ch等价,*str[0]与ch[0]等价
printf("%c\n", *str[1]); //str[1]是与ch+1等价,*str[1]与(ch+1)[0]等价,但是ch+1未定义,
//所以会没有输出
}
执行结果如下:
2)数组指针指向一个二维数组的情况
由指向一维数组中最后所写的示例
printf("%c\n", *str[1]); //str[1]是与ch+1等价,*str[1]与(ch+1)[0]等价,但是ch+1未定义,
//所以会没有输出
我们可以看出,由于是一维数组,str[1]没有定义,所以我们这里使str指向二维数组。
ch指向了二维数组的首元素ch[0],ch[0]又指向了6维数组的首元素ch[0][0];
ch+1指向了二维数组的第1个元素ch[1],ch[1]又指向了6维数组的首元素ch[1][0];
int main()
{
char ch[2][6] = {"hello","world"};
char (*str)[6] = ch;//将二维数组的首元素的地址付给str
printf("%p\n", ch);
printf("%p\n", str); //与ch等价
printf("%p\n", *str); //输出的是ch[0]的值
printf("%p\n", str[0]); //输出的是ch[0]的值
printf("%p\n", *(str+1)); //输出的是ch[1]的值
printf("%p\n", str[1]); //输出的是ch[1]的值
printf("%s\n", *str); //输出的是ch[0]数组
printf("%s\n", str[0]); //输出的是ch[0]数组
printf("%s\n", *(str+1)); //输出的是ch[1]数组
printf("%s\n", str[1]); //输出的是ch[1]数组
return 0;
}
运行结果如下:
2、指针数组
int main()
{
char ch[2][6] = {"hello","world"};
char *str[2];//两个指针
for (int i = 0; i<2; i++)
str[i] = ch[i];
printf("%p\n", str[0]); //输出的是ch[0]的值
printf("%p\n", str[1]); //输出的是ch[1]的值
printf("%s\n", str[0]); //输出的是ch[0]字符串
printf("%s\n", str[1]); //输出的是ch[1]字符串
return 0;
}
运行结果: