1.数组名指向的是一块来自栈上的区域,而指针指向的通常是动态分配内存的堆上的区域,数组名是一个指针常量,不能被修改
char
*test2()
{
char
p[] =
"hello world"
;
return
p;
}
这时不能返回p,它是局部变量,在栈区上
void
test3(){
char
str[10];
str++;//数组名是一个指针常量,不能被修改
*str=
'0'
;
}
2.内容的修改比较
以下代码中用数组可以修改值,而用指针修改则会发生运行时错误。原因在于,数组是将字符串常量复制到自己的内存区域,而指针指向的是字符串常量的地址,p[0]将会是修改常量区中的数据,这是不被允许的。
char a[] = “hello”;
a[0] = ‘X’;
cout << a << endl;
char *p = “world”; // 注意p指向常量字符串
p[0] = ‘X’; // 编译器不能发现该错误
cout << p << endl;
3.内容的复制的比较
数组:不能用“=”进行对数组的复制,只能用strcpy进行复制。不能用“==”来做比较,只能够用strcmp来进行比较
指针:和数组一样用的是strcpy来复制以及strcmp来比较。用“=”是对指针赋于地址,用“==”是比较地址
// 数组… char a[] = "hello"; char b[10]; strcpy(b, a); // 不能用 b = a; if(strcmp(b, a) == 0) // 不能用 if (b == a) … |
// 指针… int len = strlen(a); char *p = (char *)malloc(sizeof(char)*(len+1)); strcpy(p,a); // 不要用 p = a; if(strcmp(p, a) == 0) // 不要用 if (p == a) … |
3 计算内存容量
指针通常sizeof后是4,数组则不同,例如a[]="aaab",这时sizeof(a)为5,还计算了‘\0'的大小。
注意:数组作为函数的参数进行传递时,该数组自动退化为同类型的指针