数组和指针,怎么去理解?

来源:互联网 发布:排课程表软件 编辑:程序博客网 时间:2024/04/29 03:42

指针可以帮助开发人员处理复杂的数据结构,直接处理内存地址。

但是不恰当地使用指针将会导致内存泄露、内存悬挂、野指针(不安全指向)等问题的出现,

将威胁到软件系统的稳定性和安全性。

内存悬挂:如果已释放了对象,却没有将对应的指针置为NULL,该指针就是所谓的“悬挂指针”。

delete p; p=NULL;

野指针:指向被释放的或者访问受限的垃圾内存的指针。

成因:没有被初始化,delete或free后没有置NULL,指针操作超越了变量的作用范围。

class A
{
public:
void Func(void){ cout << “Func of class A” << endl; }
};
class B
{
public:
A *p;
void Test(void)
{
A a;
p = &a; // 注意 a 的生命期 ,只在这个函数Test中,而不是整个class B
}
void Test1()
{
p->Func(); // p 是“野指针”
}

};


一个指针变量有两个属性,一个是它的值(即地址),另外一个是它的类型。

指针的数据类型有两个作用:

1、指示编译在解引用时从内存中读取几个字节,指针指向 下一个元素内存 跳变几个字节; ——关于这个还是要继续找找资料看看吧

2、指示编译在进行指针类型转换时如何进行类型检查和匹配。       int nValue=0xFF00;


C/C++中有两类特殊指针:空指针和void型指针

空指针可以给任何指针赋值,所以空指针一般用于判断指针是否合法。

void型指针,又称通用指针,可指向任何变量。C语言允许把任何变量的地址作为指针赋给通用指针。

表示这个指针指向的内存中的数据的类型要由用户来指定。

比如内存分配函数malloc函数返回的指针就是void *型,用户在使用这个指针的时候,要进行强制类型转换;

也就是显式说明该指针指向的内存中是存放的什么类型的数据。如:

(int *)malloc(1024)————表示强制规定malloc返回的void*指针指向的内存中存放的是一个int型数据。

指针变量支持解引用、算数操作等基本操作。

解引用:

对于c语言中指针的操作符有两个:&和*。

对于&,好理解,翻译的也不错,就是“取地址”的意思。

但对于*,翻译为“解引用”,是“取指针指向的地址的内容”。

算数操作:

   可实现指针的移动。如果指针指向一个数组,通过指针的算数操作在指向数组某个元素的指针上加上(减去)一个整型数值,

就可以计算出指向数组另外一个元素的指针值。

int ia[]={1,2,3,4};
int *pa=ia;            //pa 指向ia[0]
int *pa2=pa+4;    //pa2指向ia[4]

注意:算数操作仅支持两种形式:指针+/-整数 (如上面代码); 指针 - 指针。

如果两个指针指向同一个数组,它们就可以相减,其结果为两个指针之间的元素数目。

无指针+指针,以及不能对void *指针进行算数操作。

如果还不是很懂,可以看看http://blog.csdn.net/gdmmhym/article/details/6451554 这个网页的东西,解释的还挺清楚的。


const 修饰指针

有两种:指向const对象的指针; const 指针。

指向const对象的指针,不允许用指针修改指针所指向的对象。

const指针,能过指针可实现所指向对象的修改,但不允许指针的值发生变化。“自以为指向const的指针”




0 0
原创粉丝点击