指针易混点

C++最强大的地方之一在于指针。
关于指针,首先我来说一下,它的好处。
好处一,用指针传递数据,节省空间和时间
好处二,可以动态的创建数组,也就是说在程序编译的时候创建内存空间。

比如说:

int length;
cin>>length;
int * A = new int[length];

以上代码是正确的,而且也很节省空间,用多少就开多少空间。与之相对立的是静态编译,在程序执行之前就已经将空间定下来,如果把最后一行改成int A[length]是通不过,因为程序执行之前需要确定数组的大小。


然后,我想讲讲书上看到的一个例子,交换两个数

#include <iostream>
using namespace std;


void swap1(int p,int q)
{
	int temp;
	temp = p;
	p = q;
	q = temp;
}


void swap2(int *p,int *q)
{
	int *temp;
	*temp = *p;
	*p = *q;
	*q = *temp;
}


void swap3(int *p,int *q)
{
	int *temp;
	temp = p;
	p = q;
	q = temp;
}


void swap4(int *p,int *q)
{
	int temp;
	temp = *p;
	*p = *q;
	*q = temp;
}
void swap5(int &p,int &q)
{
	int temp;
	temp = p;
	p = q;
	q = temp;
}


int main(){
	int a = 1,b= 2;
	swap1(a,b);
	swap2(&a,&b);
	swap3(&a,&b);
	swap4(&a,&b);
	swap5(a,b);
	cout<<a<<” “<<b<<endl;
	return 0;
}


首先说一下,正确的交换函数是swap4,swap5
理由如下:
swap1传的是 值的副本,在函数体内修改了行参,但是它们是局部变量,不会影响主函数的a和b
swap2的问题是不符合逻辑,int * temp并未分配内存,系统会随机给它一个临时变量,会造成内存泄漏
swap3 只是指针的变化,而地址的值却没有变化,举个例子就是要交换两个仓库里的物品,函数的功能只是将它们仓库门上的钥匙换了换,有什么用
swap4可以实现两数的交换,因为它修改的是指针所指向地址中的值
swap5是一个引用传递,修改的结果直接影响实参


之后,我想说几个比较容易混的概念,的确比较难理清。
函数指针:  void (*f) ()
指针函数: void* f()    这也就是函数返回指针
const指针: const  int *
指向const的指针:  int * const
指向const的const指针: const   int * const


再来两个:
数组指针:指向整形数组的指针
int (*ptr)[]
指针数组:数组里存放的是指针
int *ptr[]


最后再来一大波:
Long (*fun) (int)
这是一个函数指针,指向函数的指针,返回值是long,参数是int
float (**def)[10]
def是一个二级指针,它指向的是一个一维数组的指针,数组的元素都是float


double *(*gh)[10]
gh是一个指针,它指向一个一维数组,数组元素都是double*


double (*f[10])()
f是一个数组,f有10个元素,元素都是函数的指针,指向的函数类型是没有参数且返回double的函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言指针的基础知识点: 1.指针的定义和初始化 指针是一个变量,其值为另一个变量的地址。定义指针变量时需要指定指针所指向的变量类型,然后使用*运算符来声明指针变量。指针变量的初始化可以为其赋值为另一个变量的地址,也可以将其初始化为NULL。 2.指针的运算 指针可以进行加、减、自增、自减等运算。指针加上一个整数n时,指向的地址会增加n个存储单元的大小,减去一个整数n时,指向的地址会减少n个存储单元的大小。 3.指针的比较 指针可以进行相等、大于、小于等比较运算。当两个指针指向同一个变量时,它们相等;当两个指针指向同一数组中的不同元素时,它们可以进行大小比较。 4.指针的类型转换 指针可以进行类型转换,但需要注意转换后的指针类型必须与指向的变量类型相同,否则可能会导致程序出错。 5.指针和数组 数组名本身就是一个指针,指向数组的第一个元素。可以使用指针来访问数组中的元素,也可以将指针作为函数参数来传递数组。 以下是一个例子,演示了指针的定义、初始化、运算和比较: ```c #include <stdio.h> int main() { int a = 10; int *p = &a; // 定义指向整型变量a的指针p printf("a的值为:%d\n", a); // 输出:a的值为:10 printf("p指向的变量的值为:%d\n", *p); // 输出:p指向的变量的值为:10 printf("p的值为:%p\n", p); // 输出:p的值为:0x7ffeeb5f8a2c printf("p+1的值为:%p\n", p+1); // 输出:p+1的值为:0x7ffeeb5f8a30 printf("p的地址为:%p\n", &p); // 输出:p的地址为:0x7ffeeb5f8a28 printf("p和&a的比较结果为:%d\n", p == &a); // 输出:p和&a的比较结果为:1 return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值