char*t和char t[10]的区别是:当定义 char a[10 ] 时,编译器会给数组分配十个单元,每个单元的数据类型为字符。而定义 char *t 时, 这是个指针变量,只占四个字节,32位,用来保存一个地址。
一、char*t和char t[10]的区别
当定义 char a[10 ] 时,编译器会给数组分配十个单元,每个单元的数据类型为字符。而定义 char *t 时, 这是个指针变量,只占四个字节,32位,用来保存一个地址。
sizeof(a) = 10 ;
sizeof(s) = ?
当然是4了,编译器分配4个字节32位的空间,这个空间中将要保存地址。
printf(“%p”,s);
这个表示 s 的单元中所保存的地址。
printf(“%p”,&s);
这个表示变量本身所在内存单元地址,不要搞混了。
用一句话来概括,就是 char *t 只是一个保存字符串首地址的指针变量, char a[ ] 是许多连续的内存单元,单元中的元素为char ,之所以用 char *能达到
char a [ ] 的效果,还是字符串的本质,地址,即给你一个字符串地址,便可以随心所欲的操所他。但是,char* 和 char a[ ] 的本质属性是不一样的。
延伸阅读:
二、整型数组和整型指针
int a[]={1,2,3};//整型数组,a的指向不能改变,但数组的内容可以改变
int *p = a;//整型指针,可以改变指向
//resetiosflags(ios::right)<<setw(12)用来设置右对齐的格式
cout<<“a = “<<resetiosflags(ios::right)<<setw(12)<<a<<endl;//输出结果为a在内存中的位置
cout<<“&a = “<<resetiosflags(ios::right)<<setw(11)<<&a<<endl;//对数组名取地址,结果同上
cout<<“p = “<<resetiosflags(ios::right)<<setw(12)<<p<<endl;//输出结果与a一致
cout<<“&p = “<<resetiosflags(ios::right)<<setw(11)<<&p<<endl;
cout<<“&a[0] = “<<resetiosflags(ios::right)<<setw(7)<<&a[0]<<endl;//数组名列前茅个元素的地址
从结果可以看出,整型数组名和对数组名用取地址”&”运算符得到的结果是一致的,其结果与数组的为数不多的元素在内容在的地址相同;但对于整型指针,两者的值有所不同
cout<<“*a = “<<*a<<endl;
cout<<“*p = “<<*p<<endl;
cout<<“&(*a) = “<<&(*a)<<endl;
cout<<“&(*p) = “<<&(*p)<<endl;
cout<<“*(&a) = “<<*(&a)<<endl;
cout<<“*(&p) = “<<*(&p)<<endl;
此处* a代表的是a指向的数组的名列前茅个元素的值,* p 与* a 相同
对* a和* p取地址得到的实际上就是数组的地址
&a和&p已经是地址了,
加上* 得到的结果对于数组名而言,是数组的地址,对指针p而言,是其指向的内容的地址
void f1(int arr[])//与 f1(int *arr)在本质上一致
{
cout<<“In f1 sizeof(arr) is: “
<<sizeof(arr)<<endl;//这个时候,虽然传入的是数组,但是arr自动退化为指针
}
cout<<“In main sizeof(a) is: “<<sizeof(a)<<endl;//输出12,即整个数组的大小
cout<<“In main sizeof(p) is: “<<sizeof(p)<<endl;//输出4,即整型指针的大小
f1(a);
if (a== p)//用==对a和p进行比较时,两者是相同的
{
cout<<“a == p “<<endl;
}
else
cout<<“a != p “<<endl