数组要么被建立在静态存储区(如全局数组),要么被建立在栈上(局部数组)。数组名对应着一块内存,而不是指向一块内存,其地址与容量保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,其特征是可变。因此经常使用指针操作动态内存块,比数组灵活,却也更危险。
修改内容
char *p="hello";//其实在VS2017里边,该指针不能这样定义,而是const char *p="hello"才不会报错。
cout<<p<<endl;
所以 ∗ p *p ∗p指向常量字符串,而对于以下代码:
char p[]="hello";
p[0]="H";
cout<<p<<endl;
虽然p可以理解为一个指向数组首个元素的地址的指针,但是本质上对应着一块内存,而不是指向一块内存,内容是可以改变的。
内容复制与比较
数组
不能对数组名直接比较,若想把数组a的内容复制给b,不能使用语句b=a
,而应该使用标准库函数strcpy
进行复制。比较a和b内容是否相同,不可以直接使用if(b==a)
,因为这样比较的是地址,而内容的比较需要使用标准的库函数strcmp()
char p[] = "hello";
char a[10];
strcpy_s(a, p);//a=p;编译器会报错
cout << a << endl;
if(strcmp(a,p)==0)cout<<"true"<<endl;
指针
指针直接相等代表着两个指针指向同一个地址,如果指针a需要复制指针b的内容,需要先为指针a申请一块内存,然后使用strcpy,strcmp
等函数进行copy和比较
int len=strlen(b);
char *a=(char*)malloc(sizeof(char)*(len+1));
strcpy(a,b);
if(strcmp(a,b)==0)cout<<"true"<<endl;
计算内存容量
sizeof()
函数可以计算出数组的容量,但是如果sizeof(指针),得到的只是一个指针的字节数
int p[] = {10,1,2,3};
int a[10];
int *pp = p;
cout << sizeof(p) << endl;
cout << sizeof(a) << endl;
cout << sizeof(pp) << endl;
输出分别是16,40,8
当数组作为函数的参数进行传递时,该数组自动退化成同类型的指针:
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 8字节而不是100字节(32位操作系统是4字节)
}
int main()
{
char b[100];
Func(b);
}//输出是8,(32位操作系统输出是4)