【C++ Primer Plus】指针

来源:互联网 发布:php sql server 编辑:程序博客网 时间:2024/06/13 22:46

声明指针

int *p;
这表明*p的类型为int,p指向int类型;
p是指针(地址),而*p是int,而不是指针

注意:

  • int *p1, p2; //这里是声明一个指针(p1)和一个int变量p2
  • 在C++中,int *是一种复合数据类型,是指向int的指针
  • 可以用同样语法声明其他类型的指针:double *dp,char *str

初始化指针

int higgens = 5;int *pt = &higgens;cout << "value of higgens: " << higgens << endl;cout << "address of higgens: " << &higgens << endl;cout << "value of *pt: " << *pt << endl;cout << "value of pt: " << pt << endl;

输出结果:

value of higgens = 5address of higgens = 0x7ffddf94ac64value of *pt = 5address of pt: 0x7ffddf94ac64

使用new来分配内存

C语言可以使用malloc函数分配内存:

int *value = (int*)malloc(sizeof(int));

还可以这样

int value;int *p = &value;

C++有更好的方法:new运算符。

int *value = new int;

通用格式: 
typeName *pointer_name = new typeName;

  • 不对比就没有伤害,哈哈,确实使用new运算符简便得多
  • new int 告诉程序需要适合存储int的内存,new运算符根据类型确定需要多少字节的内存,然后分配内存,并返回改内存块的地址。
  • 上边是C++ Primer Plus原话,简单来说就是new一块int的内存块,然后把地址赋给value

使用delete释放内存

如果使用new分配内存,一定要使用delete释放,否则会发生内存泄露(memory leak)

int *ps = new int;...delete ps;

使用new创建动态数组

//创建10个int元素的数组int *psome = new int[10]; // 返回第一个元素的地址//当使用完后用delete释放delete []psome;

Example:

double *p = new double[3];p[0] = 2.4;p[1] = 2.1;p[2] = 3.3;cout << "value of p[1]: " << p[1] << endl;delete []p;  // free the memory

使用new与delete规则

  • 不要使用delete释放不是new分配的内存
  • 不要使用delete释放同一个内存块两次
  • 如果使用new[]为数组分配内存,则应使用delete[]释放
  • 如果使用new[]为一个实体分配,则应使用delete(没有方括号)释放
  • 对空指针应用delete是安全的

指针、数组、指针算术

C++将数组名解释为地址,指针+1后将指向下一个地址

int array[] = {1, 24, 433, 234};int *pArray = array; //将array地址赋值pArray,pArray指向array首元素地址,此时*pArray = 1++pArray;   //此时*pArray = 24

指针小结

  1. 声明指针格式:typeName *pointerName;
    ……