`
f002489
  • 浏览: 271696 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

数组和指针的区别

    博客分类:
  • C
C 
阅读更多
http://blog.chinaunix.net/uid-23544029-id-311366.html

C++/C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。
    数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。
下面以字符串为例比较指针与数组的特性。
1 修改内容
       示例1中,字符数组a的容量是6个字符,其内容为hello\0。a的内容可以改变,如a[0]= ‘X’。指针p指向常量字符串“world”(位于静态存储区,内容为world\0),常量字符串的内容是不可以被修改的。从语法上看,编译器并不觉得语句p[0]= ‘X’有什么不妥,但是该语句企图修改常量字符串的内容而导致运行错误。
char a[] = “hello”;
a[0] = ‘X’;
cout << a << endl;
char *p = “world”;     // 注意p指向常量字符串
p[0] = ‘X’;             // 编译器不能发现该错误
cout << p << endl;
示例1 修改数组和指针的内容
2 内容复制与比较
    不能对数组名进行直接复制与比较。示例2中,若想把数组a的内容复制给数组b,不能用语句 b = a ,否则将产生编译错误。应该用标准库函数strcpy进行复制。同理,比较b和a的内容是否相同,不能用if(b==a) 来判断,应该用标准库函数strcmp进行比较。
    语句p = a 并不能把a的内容复制指针p,而是把a的地址赋给了p。要想复制a的内容,可以先用库函数malloc为p申请一块容量为strlen(a)+1个字符的内存,再用strcpy进行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址,应该用库函数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)

示例2 数组和指针的内容复制与比较
3 计算内存容量
    用运算符sizeof可以计算出数组的容量(字节数)。示例3(a)中,sizeof(a)的值是12(注意别忘了’\0’)。指针p指向a,但是sizeof(p)的值却是4。这是因为sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量。C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。示例3(b)中,不论数组a的容量是多少,sizeof(a)始终等于sizeof(char *)。
    char a[] = "hello world";
    char *p  = a;
    cout<< sizeof(a) << endl;   // 12字节
    cout<< sizeof(p) << endl;   // 4字节
示例3(a) 计算数组和指针的内存容量
    void Func(char a[100])
    {
        cout<< sizeof(a) << endl;   // 4字节而不是100字节
}
示例3(b) 数组退化为指针
分享到:
评论

相关推荐

    数组与指针区别(很全面)

    ### 数组与指针的区别详解 #### 一、引言 在C/C++编程语言中,数组和指针是两种非常重要的数据结构。虽然它们在某些方面存在相似性,但本质上有着显著的区别。本文旨在澄清关于数组名是否等同于指针这一常见的误区...

    数组的指针和指向数组的指针变量

    数组的指针和指向数组的指针变量 数组的指针和指向数组的指针变量是编程语言中一个重要的概念。数组的指针是指向数组在内存中的起始地址,而指向数组的指针变量是指向数组元素的指针变量。 概念: * 数组的指针:...

    数组与指针的艺术.doc

    《数组与指针的艺术》是一篇深度探讨C/C++中数组和指针特性的文章,旨在帮助读者理解和掌握这两种核心概念。文章指出,数组和指针是C/C++语言的灵魂,它们提供了对底层操作的强大支持,是语言效率的保证。然而,由于...

    数组和指针练习题目(精选)

    数组和指针练习题目(精选) 在编程语言中,数组和指针是非常重要的概念,它们的应用非常广泛,理解基础是非常必要的。本节将通过多种练习题目来加深对数组和指针的理解。 指针基础 指针是一种特殊的变量,它可以...

    数组指针和指针数组的区别

    数组指针和指针数组的区别 在 C 语言中,数组指针和指针数组是两个容易混淆的概念,但它们之间有着巨大的区别。本文将详细讲解数组指针和指针数组的定义、内存布局、区别,并通过实例代码加深读者的理解。 一、...

    易语言数组转指针

    易语言数组转指针源码,数组转指针,子程序1,子程序2,子程序3,数组_整数转指针,数组_指针转整数,数组_文本转指针,数组_指针转文本,数组_字节集转指针,数组_指针转字节集,内存_申请,内存_释放,内存_取长度,内存_写入,...

    c语言中 数组名和指针的区别

    在C语言中,数组名和指针之间存在微妙且重要的区别,这往往让初学者感到困惑。虽然在某些上下文中,它们看似可以互换使用,但深入理解它们的本质差异对于编写高效、安全的代码至关重要。 ### 一、数组名与指针的...

    10 数组和指针.pdf

    10 数组和指针.pdf

    彻底理解指针,指针数组和数组指针,指针函数和函数指针

    2. **数组指针**:可以用来处理二维或更高维度的数组,简化数组操作。 3. **函数指针**:在实现回调函数、策略模式等设计模式时非常有用。 4. **指针函数**:通常用于返回动态分配的数组或其他复杂数据结构。 通过...

    数组与指针应用详解,区别

    数组与指针应用详解,区别 数组名与指针的关系是 C/C++ 编程中的一大难点,许多程序员容易将数组名与指针混淆,认为数组名就是指针。然而,实际上数组名与指针有着本质的区别。 第一点,数组名不是指针。从 sizeof...

    C++之数组与指针的异同 pdf

    在C++编程语言中,数组和指针是两种非常重要的数据结构,它们在内存管理和数据访问方面发挥着关键作用。然而,尽管它们在某些场景下可以互换使用,但它们之间存在着本质的区别,理解这些差异对于高效编程至关重要。 ...

    C\C++ 数组与指针彻底总结

    本篇文章详细讲解了指针、指针数组、数组指针、指针的指针等的应用,旨在帮助读者深入理解 C/C++ 语言中的数组和指针概念。 一、指针数组 指针数组是一个数组里存放的都是同一个类型的指针。例如,int *a[10]; 它...

    数组和指针学习资料

    在编程世界中,数组和指针是C/C++等低级语言的核心概念,它们的理解与熟练运用对于程序设计至关重要。本学习资料集包含了对数组和指针的深度解析,旨在帮助学习者彻底掌握这两个概念。 首先,我们来深入探讨数组。...

    指向二维数组的指针

    这种数组指针不同于整型指针,进行地址加 1 运算时,地址值增加了 6(放大因子为 2x3=6)。 对于指向二维数组的指针,需要了解以下几点: 1. 二维数组的地址结构:二维数组的地址结构可以看作是一个二维表格,每个...

    C++数组与指针深入剖析

    本文将深入探讨C++中数组和指针的概念、特点以及它们之间的联系和区别。 #### 二、数组的概念及内存表示 数组是一种基本的数据结构,用于存储同类型元素的集合。每个元素都可以通过索引进行访问,索引通常是从0...

    C++数组与指针对象数组对象指针

    C++数组与指针对象数组对象指针C++数组与指针对象数组对象指针

Global site tag (gtag.js) - Google Analytics