关于&a与&a[0]的区别问题代码如下#includeiostreamusing namespace stdint main(){char a[11]!@#$%^&
关于&a与&a[0]的区别问题
代码如下
#include<iostream>
using namespace std;
int main()
{
char a[11]="!@#$%^&*()";
cout<<"&a="<<&a<<endl;
for(int i=0;i<10;i++)
cout<<"&a["<<i<<"]="<<&a[i]<<endl;
return 0;
}
这里&a[i]我认为应该是输出每一位的地址
但是其运行结果是(由于不知为何8kb截图无法上传,所以只能手动)
&a=0018FF3c
&a[0]=!@#$%^&*()
&a[1]=@#$%^&*()
&a[2]=#$%^&*()
&a[3]=$%^&*()
&a[4]=%^&*()
&a[5]=^&*()
&a[6]=&*()
&a[7]=*()
&a[8]=()
&a[9]=)
这里&a[i]明显是从第i位开始输出字符串
我的问题是
1.这里&[i]是什么用法
2.如何输出第i位的地址 C++
[解决办法]1. &a的类型时 char (*)[11], 而&a[0]的类型时char*
2. STL中,Istream和ostream都重载了N个版本的op<<,和op>>.其中就有接受char*和void*
char*类型的直接输出字符串,遇到字节0结束. void*版本输出直接输出变量地址
3.关于隐式转换.隐式转换有很多,其中一种是任意的type*可以自动换到void*.
4.函数重载规则.
(1).寻求最佳匹配,所有cout << &a[0]等于输出字符串
(2).提升...
(3).隐式转换. 所有cout << &a拆开等于 cout << static_cast<void*>( char (*)[11] )
如果要输出标示符的地址,只要cout << static_cast<void*>( &obj )
[解决办法]#include <iostream>
void GetMemory(char* p,int num)
{
p=(char*)malloc(sizeof(char)*num);
};
void main()
{
char *str=NULL;
GetMemory(str,100);
strcpy(str,"hello");
getchar();
}
希望上面的例子能帮助你理解,这里的str并不是地址,所以程序会崩溃。
[解决办法]如果是整形,你输出a不是a[0]的地址?
如果是char型,你输出a就是字符串。
编译器重载过的。
[解决办法]#include<iostream>
using namespace std;
int main()
{
char a[11]="!@#$%^&*()";
cout<<"&a="<<&a<<endl;
for(int i=0;i<10;i++)
cout<<"&a["<<i<<"]="<<(long)&a[i]<<endl;
return 0;
}