C++ 之 数组名和指针

在很多情况下,可以相同的方式使用数组名和地址

区别之一是:

可以修改指针的值  而数组名是常量不可修改

另一个区别:

对数组应该 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;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值