指针与数组的对比(——选自:C++内存管理技术内幕)
2015-07-30 15:54
387 查看
数组:
数组要么是在静态存储区上创建(如全局数组),要么是在栈上创建的。数组名代表着
段连续的内存,其地址和容量在生命周期内是不会改变的,而只能改变其数组内容。
指针:
指针是一种指针类型的变量,变量为一个内存的首地址,可以改变的,所以一般可以用指针
来指向动态开辟的内存。
下面以字符串为例来比较数组和指针:
1. 修改内容
char a[] = “ hello” ;
a[0] = ‘ X’ ;
cout << a << endl;//输出的是Xello
char *p = “ world” ; // 注意 p 指向常量字符串
p[0] = ‘ X’ ; // 编译器不能发现该错误//常量字符串的内容是不能被修改的。
cout << p << endl;
2.内容复制与比较
不能对数组名进行直接复制与比较。若想把数组 a 的内容复制给数组 b,不能用语句 b = a ,否则将
产生编译错误。应该用标准库函数 strcpy 进行复制。同理,比较 b 和 a 的内容是否相同,不能用 if(b==a)
来判断,应该用标准库函数 strcmp 进行比较。
a是一个数组名,p是一个指针语句 p = a 并不能把 a 的内容复制给指针 p,而是把 a 的地址赋给了 p。
要想复制 a 的内容,可以先用库函数 malloc 为 p 申请一块容量为 strlen(a)+1 个字符的内存,再用 strcpy
进行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址,应该用库函数 strcmp 来比较。
3.计算内存容量
用运算符 sizeof 可以计算出数组的容量(字节数)。如下示例中, sizeof(a)的值是 12(注意别忘了’’)。
指针 p 指向 a,但是 sizeof(p)的值却是 4。这是因为 sizeof(p)得到的是一个指针变量的字节数,相当于
sizeof(char*),而不是 p 所指的内存容量。 C++/C 语言没有办法知道指针所指的内存容量,除非在申请内
存时记住它。
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节,表示的是一个字符指针占有的字节数
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。如下示例中,不论数组 a 的容
量是多少, sizeof(a)始终等于 sizeof(char *)。
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是 100 字节
}
数组要么是在静态存储区上创建(如全局数组),要么是在栈上创建的。数组名代表着
段连续的内存,其地址和容量在生命周期内是不会改变的,而只能改变其数组内容。
指针:
指针是一种指针类型的变量,变量为一个内存的首地址,可以改变的,所以一般可以用指针
来指向动态开辟的内存。
下面以字符串为例来比较数组和指针:
1. 修改内容
char a[] = “ hello” ;
a[0] = ‘ X’ ;
cout << a << endl;//输出的是Xello
char *p = “ world” ; // 注意 p 指向常量字符串
p[0] = ‘ X’ ; // 编译器不能发现该错误//常量字符串的内容是不能被修改的。
cout << p << endl;
2.内容复制与比较
不能对数组名进行直接复制与比较。若想把数组 a 的内容复制给数组 b,不能用语句 b = a ,否则将
产生编译错误。应该用标准库函数 strcpy 进行复制。同理,比较 b 和 a 的内容是否相同,不能用 if(b==a)
来判断,应该用标准库函数 strcmp 进行比较。
a是一个数组名,p是一个指针语句 p = a 并不能把 a 的内容复制给指针 p,而是把 a 的地址赋给了 p。
要想复制 a 的内容,可以先用库函数 malloc 为 p 申请一块容量为 strlen(a)+1 个字符的内存,再用 strcpy
进行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址,应该用库函数 strcmp 来比较。
3.计算内存容量
用运算符 sizeof 可以计算出数组的容量(字节数)。如下示例中, sizeof(a)的值是 12(注意别忘了’’)。
指针 p 指向 a,但是 sizeof(p)的值却是 4。这是因为 sizeof(p)得到的是一个指针变量的字节数,相当于
sizeof(char*),而不是 p 所指的内存容量。 C++/C 语言没有办法知道指针所指的内存容量,除非在申请内
存时记住它。
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节,表示的是一个字符指针占有的字节数
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。如下示例中,不论数组 a 的容
量是多少, sizeof(a)始终等于 sizeof(char *)。
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是 100 字节
}
相关文章推荐
- 牛人十个月自学C++ 现在做C#开发工作
- C++学习笔记(五)
- C++学习笔记(四)
- 黑马程序员--C语言-指针函数及应用
- c++中容器之总结篇
- c++之string类编写
- C/C++中volatile关键字详解
- C++学习笔记(三)
- C++学习笔记(二)
- 【effective c++读书笔记】【第2章】构造/析构/赋值运算(1)
- 【effective c++读书笔记】【第2章】构造/析构/赋值运算(1)
- C语言中控制台应用程序中空格的输出。编译环境:vs2010
- c语言实现几种排序算法OC实现
- 【C语言探索之旅】 第二部分第十课:练习题和习作
- 【语言-c++】map的使用
- C++学习笔记(一)
- 读书笔记MoreEffectiveC++(31)
- C语言程序的构成
- 关于C语言中的运算符
- C++OJ提交题目中的语言选项里G++与C++的区别