数组:
数组要么是在静态存储区上创建(如全局数组),要么是在栈上创建的。数组名代表着
段连续的内存,其地址和容量在生命周期内是不会改变的,而只能改变其数组内容。
指针:
指针是一种指针类型的变量,变量为一个内存的首地址,可以改变的,所以一般可以用指针
来指向动态开辟的内存。
下面以字符串为例来比较数组和指针:
1. 修改内容
char a[] = “ hello” ;
a[0] = ‘ X’ ;
cout << a << endl;//输出的是Xello
char *p = “ world” ; // 注意 p 指向常量字符串
p[0] = ‘ X’ ; // 编译器不能发现该错误//常量字符串的内容是不能被修改的。
cout << p << endl;
2.内容复制与比较
不能对数组名进行直接复制与比较。若想把数组 a 的内容复制给数组 b,不能用语句 b = a ,否则将
产生编译错误。应该用标准库函数 strcpy 进行复制。同理,比较 b 和 a 的内容是否相同,不能用 if(b==a)
来判断,应该用标准库函数 strcmp 进行比较。
a是一个数组名,p是一个指针语句 p = a 并不能把 a 的内容复制给指针 p,而是把 a 的地址赋给了 p。
要想复制 a 的内容,可以先用库函数 malloc 为 p 申请一块容量为 strlen(a)+1 个字符的内存,再用 strcpy
进行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址,应该用库函数 strcmp 来比较。
3.计算内存容量
用运算符 sizeof 可以计算出数组的容量(字节数)。如下示例中, sizeof(a)的值是 12(注意别忘了’’)。
指针 p 指向 a,但是 sizeof(p)的值却是 4。这是因为 sizeof(p)得到的是一个指针变量的字节数,相当于
sizeof(char*),而不是 p 所指的内存容量。 C++/C 语言没有办法知道指针所指的内存容量,除非在申请内
存时记住它。
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节,表示的是一个字符指针占有的字节数
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。如下示例中,不论数组 a 的容
量是多少, sizeof(a)始终等于 sizeof(char *)。
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是 100 字节
}