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++编程语言中,数组和指针是两种非常重要的数据结构。虽然它们在某些方面存在相似性,但本质上有着显著的区别。本文旨在澄清关于数组名是否等同于指针这一常见的误区...
数组的指针和指向数组的指针变量 数组的指针和指向数组的指针变量是编程语言中一个重要的概念。数组的指针是指向数组在内存中的起始地址,而指向数组的指针变量是指向数组元素的指针变量。 概念: * 数组的指针:...
《数组与指针的艺术》是一篇深度探讨C/C++中数组和指针特性的文章,旨在帮助读者理解和掌握这两种核心概念。文章指出,数组和指针是C/C++语言的灵魂,它们提供了对底层操作的强大支持,是语言效率的保证。然而,由于...
数组和指针练习题目(精选) 在编程语言中,数组和指针是非常重要的概念,它们的应用非常广泛,理解基础是非常必要的。本节将通过多种练习题目来加深对数组和指针的理解。 指针基础 指针是一种特殊的变量,它可以...
数组指针和指针数组的区别 在 C 语言中,数组指针和指针数组是两个容易混淆的概念,但它们之间有着巨大的区别。本文将详细讲解数组指针和指针数组的定义、内存布局、区别,并通过实例代码加深读者的理解。 一、...
易语言数组转指针源码,数组转指针,子程序1,子程序2,子程序3,数组_整数转指针,数组_指针转整数,数组_文本转指针,数组_指针转文本,数组_字节集转指针,数组_指针转字节集,内存_申请,内存_释放,内存_取长度,内存_写入,...
在C语言中,数组名和指针之间存在微妙且重要的区别,这往往让初学者感到困惑。虽然在某些上下文中,它们看似可以互换使用,但深入理解它们的本质差异对于编写高效、安全的代码至关重要。 ### 一、数组名与指针的...
10 数组和指针.pdf
数组与指针应用详解,区别 数组名与指针的关系是 C/C++ 编程中的一大难点,许多程序员容易将数组名与指针混淆,认为数组名就是指针。然而,实际上数组名与指针有着本质的区别。 第一点,数组名不是指针。从 sizeof...
在C++编程语言中,数组和指针是两种非常重要的数据结构,它们在内存管理和数据访问方面发挥着关键作用。然而,尽管它们在某些场景下可以互换使用,但它们之间存在着本质的区别,理解这些差异对于高效编程至关重要。 ...
本篇文章详细讲解了指针、指针数组、数组指针、指针的指针等的应用,旨在帮助读者深入理解 C/C++ 语言中的数组和指针概念。 一、指针数组 指针数组是一个数组里存放的都是同一个类型的指针。例如,int *a[10]; 它...
在编程世界中,数组和指针是C/C++等低级语言的核心概念,它们的理解与熟练运用对于程序设计至关重要。本学习资料集包含了对数组和指针的深度解析,旨在帮助学习者彻底掌握这两个概念。 首先,我们来深入探讨数组。...
这种数组指针不同于整型指针,进行地址加 1 运算时,地址值增加了 6(放大因子为 2x3=6)。 对于指向二维数组的指针,需要了解以下几点: 1. 二维数组的地址结构:二维数组的地址结构可以看作是一个二维表格,每个...
本文将深入探讨C++中数组和指针的概念、特点以及它们之间的联系和区别。 #### 二、数组的概念及内存表示 数组是一种基本的数据结构,用于存储同类型元素的集合。每个元素都可以通过索引进行访问,索引通常是从0...
C++数组与指针对象数组对象指针C++数组与指针对象数组对象指针