指针和数组在不少地方可以互换使用,但两者并不等价。数组名对应着(而不是指向)一块内存,其地址和大小在生命周期内保持不变,只有数组的内容可以改变;而指针变量则是一个变量,它可以存放任意相同数据类型变量的地址值,可以随时指向其他内存块,所以指针比数组更加灵活。
预防指针错误方法:
一般指针:
(1)声明指针时一定要初始化,如不初始化就将其置为NULL,否则该指针会指向一个不确定的地方。
(2)delete指针以后,一定要将其置为NULL。
(3)当指针指向数组时,谨防指针操作越界。
(4)避免指针指向一个已经消失的局部变量。
对于动态内存指针:
(5)指针消亡了,并不表示它所指向的动态内存会被自动释放。
(6)动态内存被释放了,并不表示指向该动态内存的指针会消亡或自动变成NULL指针。
下面通过例子详解指针数组区别:
- //程序1 :指针和数组区别。
- #include <iostream>
- using namespace std;
- //测试函数
- void main(void)
- {
- //数组定义,内存中只分配数组空间
- char a[]="hello"; //定义并初始化数组
- a[0]='T'; //数组的元素可以改变的
- cout<<a<<endl; //显示:Tello
- //定义一个指针变量,且指针指向了一个常量字符串
- //内存中分配两个空间:指针变量空间;常量字符串空间
- char *p="World";
- //p[0]=x; //该语句编译通过,但运行时会发现p指向一个常量,该语句试图修改常量,错误。
- cout<<p<<endl; //显示:World
- //数组赋值的方法
- char b[]="hello";
- char c[10];
- strcpy(c,b); //数组赋值,不能用c=b,会发生错误
- if(0==strcmp(c,b)) //数组比较,不能用if(c==b)
- {
- cout<<c<<endl; //显示:hello
- }
- //复制指针所指向的字符串的方法
- int len=strlen(b);
- char *p2=new char[len+1]; //+1用来存放'/0'
- if(NULL==p2)
- {
- cout<<"动态内存分配失败。/n";
- exit(0);
- }
- strcpy(p2,b); //不要用p2=b,如这样用,则只是p2指向了数组b而已,而刚才p2用new申请的那一部分内存空间则泄露了
- if(0==strcmp(p2,b)) //不要用if(p2==b),那样只能判断p2是否指向b
- {
- cout<<p2<<endl; //显示:hello
- }
- delete p2;
- p2=NULL;
- //字符指针变量的长度和该指针所指向的字符串的长度的区别
- char d[]="Hello world"; //d是一个数组。其空间大小是数组的空间大小
- char *p3=d; //p3只是一个指针变量,其大小只是变量本身的大小
- cout<<sizeof(d)<<endl; //12字节
- cout<<sizeof(p3)<<endl; //4字节
- }
输出结果:
Tello
World
hello
hello
12
4
Press any key to continue