c++指针小结

本文深入解析C++中指针的声明、赋值、解除引用、运算及动态联翩等核心概念,通过实例演示如何使用指针进行内存操作,包括数组的动态与静态联翩的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、声明指针

声明指向特定类型的指针,使用以下格式:

typeName *pointerName;

示例:

double *pn;   //声明一个double类型的指针
char *pc;     //声明一个char类型的指针

2、给指针赋值

应将内存地址赋值给指针,对变量名应用&运算符,来获得变量地址,或使用new运算符返回未命名的内存地址。

示例:

double *pn;
double *pa;
char *pc;
double doub = 3.2;
pn = &doub;                //使用&运算符给指针赋值
pc = new char;            //使用new给指针赋值     
pa = new double[30];    //使用new给指针赋一个数组地址值

3、对指针解除引用

对指针解除引用意味着获得指针指向的值。对指针应用解除引用或间接运算符(*)来解除引用。因此,如果pn值指针,则*pn是指针指向的数值。

示例:

char a = 'Y';
char *pa = &a;    //指针pa指向a的地址
*pa = 'S';    //将指针指向的值改为S
cout << a;    //输出S

另一种对指针解除引用的方法是使用数组表示法,例如,pa[0]和*pa是一样的。绝对不要对未被初始化未适当地址的指针解除引用。

4、区分指针和指针所指向的值

如果pt是指向int的指针,则*pt不是指向int的指针,而是完全等同于一个int类型的变量。pt才是指针。

示例:

int *pt = new int;     //声明一个指针并初始化
*pt = 5;                //*pt 相当一个int类型的变量,可以直接赋值

5、数组名与数组

在多数情况下,c++将数组名视为数组第一个元素的地址。

如:   int  tacos[10];     //tacos  相当于  &tacos[0]

一般例外情况是,将sizeof运算符用于数组名时,此时将返回整个数组的长度(单位为字节)。

6、指针运算

c++允许将指针和整数相加。加1的结果等于在原来地址加上指向的对象占用的总字节数。还可以一个指针减去另一个指针,或得两个指针的差。后一种运算将得到一个整数,仅当两个指针指向同一个数组是,这种运算才有意义,这将得到两个元素的间隔。

示例:

int tacos[10] = {1,2,3,4,5,6,7,8,9,0};
int *pt = tacos;       //pt指向数组第一个元素的地址
pt = pt+1;             //pt指向第二个元素地址
int *pe = &tacos[9];   //pe指向第10个元素地址
pe = pe - 1;           //pe指向第9个元素地址
int diff = pe - pt;    //获得数组第9个元素与第2个元素的地址差,将结果储存在diff中

7、数组的动态联翩与静态联翩

使用数组声明来创建数组是,采用的是静态联翩,即数组的长度在编译的时候设置:

int tacos[10];        //使用静态联翩,即在编译时已设置好

使用new[] 运算符创建数组是,将采用动态联翩(动态数组),即将在运行时为数组分配空间,其长度也将在运行时设置好。使用完后,应使用delete[] 释放其占用的内存:

int size;
cin >> size;
int *pz = new int[size];  //向内存申请一块空间
...
...
delete [] pz;        //释放内存

8、数组表示法和指针表示法

使用方括号数组表示法等同于对指针解除引用,数组名和指针变量都是如此,因此对于指针和数组名,既可以使用指针表示法,也可以使用数组表示法。

示例:

int *pt = new int[10];
*pt = 5;               //将第一个元素赋值为5,相当于pt[0]=5;
pt[0] = 6;            //相当于*pt = 6;
pt[9] = 7;            //相当于*(pt+9) = 7;
int coats[10];
*(coats + 4) = 12;    //相当于coats[4] = 12

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值