代码改变世界

指针

2013-04-07 19:09  Keiven_LY  阅读(210)  评论(0编辑  收藏  举报

摘要:

程序中定义的某个变量,在编译时系统就会给这个变量分配内存单元,并根据程序中定义的变量类型分配一定长度的内存空间,每个内存单元中存放着变量的值。

为了便于内存单元的存取,系统为每个内存单元分配了一个地址,则程序中定义指向“地址”的变量即为指针变量,简称为:指针。

指针是一类特殊的变量,它保存的不是数据值,而是程序中定义的某个变量(整型,实型变量)在内存中的地址。

指针的定义:

int *p1;

float *p2;

char *p3;

void *p4(这里定义一个空指针,可以指向任何对象,也称为通用指针)

指针的初始化:

(1)指针对象可以被一个具有相同类型的对象初始化,如:

int i=10;

int *p=&i; (这里p定义的是整型指针,而i为整型变量,符号&为取地址符,它所得为后面跟的变量的内存地址)

(2)同类型的指针之间相互赋值,如:

int *p1=p; (这里的p是上面定义的指向整型变量i的指针,故p1也是指向整型变量i)

(3)通过关键字new直接分配内存地址得到初始值,如:

int *p2 = new int(60); (这里为指针p2开辟了60个字节的内存单元)

注:一般通过new分配的有效指针,最后都要进行内存释放,如果不进行内存释放,会造成内存空间不足的问题

内存释放语句: delete [60] p2;

例1:指针赋值语句练习

#include <iostream>
using namespace std;

void main()
{
    int a=100;
    int *p,*p1,*p2;   //定义三个整型指针变量
    p=&a;             //将变量a的地址赋值给指针变量p
    p1=p;             //将p中变量a的地址复制给指针变量p1,使指针变量p与p1均指向变量a
    p2=NULL;          //将指针变量p2赋空值
    cout<<"a="<<a<<','<<"*p="<<*p<<','<<"p="<<p<<endl;
    *p1=200;          //间接给变量a赋值为200
    cout<<"a="<<a<<','<<"*p="<<*p<<','<<"p="<<p<<endl;
    cout<<"*p1="<<*p1<<','<<"p1="<<p1<<endl;
    system("pause");
}

例2:通过关键字new初始化

#include <iostream>
#include <string>
using namespace std;

void main()
{
    char *p;
    strcpy(p,"Hello World !");
    cout<<p<<endl;
    system("pause");
}

上述代码编译出现如下错误:

 

warning C4700: 使用了未初始化的局部变量“p”

原因分析:

语句char *p; 给变量p分配了一个地址单元,但并没有分配p所指向的数据空间,在执行复制语句时,不知道将字符串"Hello World !"放在内存中的什么地方,因而会出错。

修改如下:

使用关键字new先给变量p分配所指向的内存空间,再将字符串放在这个内存空间中,并由p指向第一个字符位置

#include <iostream>
#include <string>
using namespace std;

void main()
{
    char *p;
    p=new char[15];
    strcpy(p,"Hello World !");
    cout<<p<<endl;
    system("pause");
}