数组和指针

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,还计算了‘'的大小。
注意:数组作为函数的参数进行传递时,该数组自动退化为同类型的指针
原文地址:https://www.cnblogs.com/upup-2015/p/5044474.html