简介
该文章主要介绍char (*str)[2]与char * str[2]之间的区别,其实也就是我们经常所说的数组指针与指针数组的区别。
ps:之所以选用char (*str)[2] 与 char * str[2]作为文章题目而不是数组指针与指针数组,个人认为后者太容易搞混了,感觉还是记住两句代码更简单点。
char *str[2]
这就是我们常说的指针数组(array of pointrs)。
- 首先这是一个数组,数组中包含两个数据
- 数组中包含的数据为char类型的指针
例程
#include <iostream>
int main()
{
char s[2] = { 'Z','K' };
char *str[2];
str[0] = &s[0];
str[1] = &s[1];
std::cout << "sizeof(str):"
<< sizeof(str) << std::endl;
std::cout << "s[0] address:" << (void*)str[0] << "\n";
std::cout << "s[1] address:" << (void*)str[1] << "\n";
system("pause");
return 0;
}
//输出结果
sizeof(str):8
s[0] address:004FFD78
s[1] address:004FFD79
- sizeof(str):8 因为str数组包含两个指针,所以长度是8
- 存储的两个地址为0x004FFD78与0x004FFD79,因为指向的是两个char,所以地址相差一个字节
char(*str)[2]
这就是常说的数组指针(a pointer to an array).
- 首先它是一个指针
- 该指针指向一个char[2]的数组,且只能指向一个char[2]的数组
例程
#include <iostream>
int main()
{
char s[2] = { 'Z','K'};
char (*str)[2];
str = &s; //注意这里的&符号,这里我们把s[2]作为一个整体,当取址的时候,需要使用取址符
std::cout << "sizeof (*str):" << sizeof(str) << "\n";
std::cout << "s[0] address:" << (void*)&s[0] << "\n";
std::cout << "str:" << str << "\n";
std::cout << "str+1:" << (str + 1) << "\n";
system("pause");
return 0;
}
//输出结果
sizeof (*str):4
s[0] address:0026F950
str:0026F950
str+1:0026F952
- sizeof(*str):4 因为str只是一个指针而已,所以长度为4
- str所存储的地址与s[0]的地址是相同的,为char[2]的首地址
- str+1得到的结果与str相差两个字节,因为str指向的是一个数组,所以当指向加1操作的时候,相加的值为数组的总长度