C++学习中应该注意的知识点之指针

一、指针的两种写法

typename* ptr;typename *ptr;

其中①是C的风格,强调* ptr是一个typename类型的值;②是C++中的写法,更趋向于把 typename *是一个类型,即指向typename的指针。这两种写法对于编译器来说无任何区别。

二、指针的危险

此处的危险是指,指针解引用前,必须为指针变量赋予确定的、适当的地址。否则会造成bug。如下代码是不允许的,通常这种代码是编译不过去的。

int *f;*f=232456;

三、new的使用规范

  • 不要使用delete来释放不是new分配的内存;
  • 不要使用delete释放同一内存块两次;
  • 如果使用new[]为数组分配内存,则应使用delete[]来释放,尤其是用指针来实现的类,如string,必须配对使用,否则会造成内存泄漏;
  • 如果使用new为一个实体分配内存,则应使用delete来释放;
  • 对空指针应用delete是安全的。

四、 动态数组的注意事项

new出的动态数组返回的是数组的首地址,这与普通数组是一样的。与普通数组不一样的是动态数组可以修改数组名的值,而数组不可以。如下所示:

#include<iostream>
using namespace std;
int main(void) {
  double *p = new double[3];//new 出3个double类型的空间
	p[0] = 12.3;
	p[1] = 23.3;
	p[2] = 0.8;
	cout << "p not move 1" << " p[0]:" << p[0] << " p[1]:" << p[1] << " p[2]:" << p[2] << endl;
	p = p + 1;
	cout << "p move 1" << " p[0]:" << p[0] << " p[1]:" << p[1] << "p[2]:" << p[2] << endl;
	getchar();
}

执行结果:
在这里插入图片描述
可以看出p+1后,p的指向发生了变化。而普通数组的数组名+1再赋值给数组名后编译不通过,报表达式必须是可修改的左值的错,并不是说数组名自身不能加。**为什么报这个错?**因为数组名都表示数组第一个元素的地址,可将其看作是一个指针常量,常量是不能作为左值的。动态数组名之所以能进行赋值操作,因为它本身是个指针变量,只不过new后赋予了动态数组的首地址作为初值罢了。**同时用sizeof(数组名)获取的是数组的大小,而sizeof(pointer)获取的是指针的大小。

五、指针、数组与指针算术

5.1 数组的地址

数组名为数组首元素的地址,对数组名取地址,代表的是整个数组的地址。
举个例子来说明,假如有如下代码:

	char p[3];
	char *a = p;
	void *aa = &p;
	char (*aaa) [3]= &p;

从数字上说,a、aa和aaa三者的值相同,但是a+1表示移动了1个bit,移动的是char类型大小的字节;而aa+1和aaa+1移动的是整个数组的大小:即3*sizeof(char),因此&p指向的是包含3个元素的char数组(char( * )[3])。其实,aaa的类型就是char( * )[3]。

5.2 指针与字符串

cout输出是从给定的字符地址开始一直输出字符,直到遇到’\0’为止。应使用strcpy()或者strncpy(),而不是赋值运算符来将字符串赋给数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引用[1]:这段代码展示了C++指针的基本用法。在这段代码,我们定义了一个整型变量a,并用指针p指向a的地址。通过*p可以访问到a的值,通过&p可以获取a的地址。[1] 引用[2]:这段代码展示了一级指针和二级指针的用法。一级指针pi指向整型变量i,二级指针ppi指向一级指针pi。通过*pi可以访问到i的值,通过**ppi可以访问到i的值。通过改变一级指针的值和指向,可以改变所指向的变量的值和指向。[2] 引用[3]:这段代码展示了指针的动态内存分配和指向结构体的指针的用法。通过new关键字可以动态分配内存,并将指针指向新分配的内存空间。在example1函数,通过new int(3)分配了一个整型变量,并将指针p指向该变量。在example2函数,通过new int[3]分配了一个整型数组,并将指针q指向该数组的首地址。在example3函数,通过new student[3]分配了一个结构体数组,并将指针stlist指向该数组的首地址。[3] 指针知识点包括以下几个方面: 1. 指针的定义和声明:可以使用*来声明指针变量,例如int *p; 2. 指针的赋值和访问:可以使用&来获取变量的地址,通过*来访问指针所指向的变量的值,例如*p = 10; 3. 动态内存分配:可以使用new关键字来动态分配内存,例如int *p = new int; 4. 指针的指向:可以通过改变指针的值来改变指针所指向的变量或内存空间,例如p = &a; 5. 一级指针和二级指针:一级指针指向变量的地址,二级指针指向一级指针的地址,可以通过**来访问二级指针所指向的变量的值。 6. 指针和数组:可以使用指针来操作数组,例如通过指针访问数组元素,通过指针指向数组的首地址。 7. 指针和结构体:可以使用指针来指向结构体,通过指针访问结构体的成员。 以上是指针的一些基本知识点,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泽箬酱咧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值