在很多情况下,可以相同的方式使用数组名和地址
区别之一是:
可以修改指针的值 而数组名是常量不可修改
另一个区别:
对数组应该 sizeof 运算符得到的是数组的长度
对指针应用 sizeof 得到的是指针的长度
特点:
数组名被解释为其第一个元素的地址 而数组名应用地址运算符时,得到的是整个数组的地址
例如:
int main(void)
{
int num[16]={1,2,3,4,5,6,7,8,9,0};//num是数组num的第一个元素的地址
int (*pnum)[16]=# //pnum 是数组的地址
//对数组名(数组第一个元素的地址)+1 得到:地址自加类型字节数的长度
//对数组地址 +1 得到:数组元素个数程序类型的长度
cout<<"num: "<<num<<" num+1: "<<num+1<<endl;
cout<<"&num: "<<&num<<" &num+1: "<<&num+1<<endl;
return 0;
}
运行结果为:
可知:从 00FCFD08 到 00FCFD0C 增加4
从00FCFD08 到 00FCFD48 增加了 64 个字节
因为元素个数为16: 即 4*16=64 字节(使用十六进制的地址显示)
但是 数组名显示的一定是地址吗? 答案是不一定!!!
反例:
int main(void)
{
char str[16] = { "abcd" }; //使用char类型 创建 数组 长度为16
char(*pstr)[16] = &str; //将数组地址赋值给 pstr
cout << str << " " << pstr << endl; //输出 str第一个元素地址 以及 数组地址
cout << str + 1 << " " << pstr + 1 << endl; //+1 再次输出
return 0;
}
运行结果:
可见:
当类型为 char时 则数组名输出的是 char数组的内容 而&str 输出的是数组的地址
+1 后输出 便将地址的长度往后推移再次输出cahr数组的内容 而&str输出的是16*1=16个字节(使用十六进制的地址显示)
所以:当类型为char时显示的并非地址 而是数组的内容!
原因是:char类型的数组名是第一个元素的地址,打印时 cout<<对char数组进行 了特殊处理 因为字符串常量也是地址
因此所要输出字符串的地址应为:
int main(void)
{
char str[16] = { "abcd" }; //使用char类型 创建 数组 长度为16
char(*pstr)[16] = &str; //将数组地址赋值给 pstr
cout << str << " " << (int*)str << " " << pstr << endl; //输出 str第一个元素地址 以及 数组地址
cout << str + 1 << " " << (int*)(str + 1) << " " << pstr + 1 << endl; //+1 再次输出
return 0;
}