您的位置:首页 > 其它

数组与指针的区别

2018-03-08 18:44 176 查看
首先对于编译器而言,一个数组是一个地址,一个指针是一个地址的地址。
      数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
      例如:
      void main(void)
      {
      int a[10];
      a ++;//error, a is left value,but can't be changed.
      }
      指针可以随时指向任意类型的内存块,远比数组灵活,但也更危险。下表是指针和数组一个简单的比较
      数组和指针的特点
      数组                       指针
      保存数据                保存地址
      直接访问数据        间接访问数据,先取得指针的内容,然后以它为地址,取得数据
      用于存储数目固定且类型相同的数据     通常用于动态数据结构
      编译器自动分配和删除      动态的分配和删除,相关函数为malloc() 和free()
      自身即为数据名      通常指向隐式数据
      1、指针和数组都可以在初始化的时候赋予字符串常量。尽管看上去一样,底层机制却不同。指针在定义的时候,编译器并不会为指针所指向的对象分配内存空间,它只是分配指针变量的空间。除非以一个字符串常量对其进行初始化。下面的定义创建了一个字符串常量(为其
      分配了内存空间)
      char *p = "abcd";
      在ANSI C中,初始化指针时所指向的字符串被定义为只读,如果想通过指针修改字符串的
      时候,会产生未定义的行为。
      数组也可以用字符串常量进行初始化,但是其内容可以被修改。
      2、内容的复制和比较
      不能对数组进行字节复制和比较,对于两个数组a,b,不能用b=a进行复制,而应当使用标准库函数strcpy()。也不能使用if(b==a)进行比较,应当使用strcmp()。
      而对于指针p,如果要想将数组a中的内容复制,要先申请一块内存区域,然后使用strcpy()进行拷贝。
      void main(void )
      { char a[] ="hello";
      char b[10];
      strcpy(b,a); // can't use b=a;
      if(strcmp(b,a) == 0);//can't use if(b==a)
      char *p = NULL;
      p = (char *)malloc(sizeof(char )*(strlen(a)+1);
      strcpy(p, a);
      if(strcmp(b,a) == 0);
      }
      3、计算内存容量
      用运算符sizeof()可以计算出数组的容量(字节数)。如下例
      char a[] = "abcdef";
      char *p = a;
      sizeof(a) = 7;
      sizeof(p) = 4;//sizeof(p) equal to sizeof(char *) =4
      注意当数组名作为函数参数进行传递时,该数组自动退化该类型的指针,如下例:
      void TEST(char a[100])
      {  
      cout<<sizeof(a)<<endl;// in this place, sizeof(a) is equal to sizeof(char *) = 4
      }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: