int main(int argc, char* argv[])
{
short n = 5;
char nc[] = "asdf";
cout<<sizeof(n)<<endl;
//short的字节长
cout<<sizeof(&n)<<endl;
//指针的字节长
cout<<nc<<endl;
//1
//可能由于重载缘故,从nc所指向的地址开始输出对应的char字符,直至'\0',注意这里输出的不是16进制地址值
cout<<&nc<<endl;
//2
//这里为地址值。所指向对象为'a'
cout<<&nc[0]<<endl; //3
//同样&nc[0]为地址值,与1一样。因此输出的为字符串。只是在意义上有点区别,前者为字符串首地址,后者为第一个元素的地址
cout<<(int *)nc<<endl; //4
//由于字符数组的特殊性,需要显示转换,才能输出地址值
cout<<(int *)&nc<<endl; //5
//由于&nc本身就已经是一地址值,用此这里的类型转换没多大意义,结果与2一模一样
cout<<(int *)&nc[0]<<endl; //6 //参照1与3,6与4类似
cout<<sizeof(nc)<<endl;
//5
数组名并不是指针
cout<<sizeof(&nc)<<endl;
//5
cout<<sizeof(&nc[0])<<endl; //4. 因为nc[0]为一个字符对象。&nc[0]就是一地址值(指针).所有指针值都为4。
nc[2] = 'A';
char* p = "Hello World1";
p[2] = 'A';
return 0;
}
分析:nc,&nc都有2种理解,一个就是"16进制地址值"ox0012ff3c,一个是字符串"asdf".这2种是一个意思,前者是在系统中表现形式,后者为人们所熟知的表示形式
就像10,在计算机中是以2进制存储的。但nc,和&nc的区别在于,nc指向的对象为'a' 's' 'd' 'f' '\0',一个连续的整体。而&nc所指向德为'a'
我们无法通过&nc这种方式来修改nc("asdf")内的内容,因为"ox00123ff3c",因为它是常量,只能读,不能修改。但我们可以像nc[2] = 'A';
这样修改nc的内容。这并没有改变"asdf"改变。而是将"asAf"赋给了数组nc。
说通俗点。如int n = 12; 我们不能将12改成1,再赋给n,这是不现实的。但我们可以直接将1赋给n。
char* p = “Hello World1”;
p[2] = ‘A’;
p也同样2种理解。一个就是"16进制地址值,一个是字符串“Hello World1”。类似于上面的&nc,p指向的为H,因此我们通过p[2]修改字面值是不正确的。
这个例子再一次说明了这一点....指针这样用是错的。。。
typedef就是一种简化数据类型的方法,便于理解。
typedef char* p pstr;
pstr = “Hello World1”;