笔试复习_C++_指针(一)

本文主要介绍了C++中的指针概念,包括指针的定义、取地址运算符&、间接访问运算符*,以及指针的各类应用场景,如二级指针、指针数组、指向常量的指针、指针常量、指针与一维数组和二维数组的交互等。同时,文章通过例题解析了指针在实际操作中的运用。

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

*今天开始找一个地方存放复习资料~!
想到哪写哪吧_(:з」∠)_*

指针(一)

指针
定义:特殊类型变量,用来存放变量的地址。
一个变量的地址称为这个变量的指针;一个变量专门用来存放变量的地址,称为指针变量。
指针变量定义后,系统为之分配存储单元用来存放地址,长度为4字节(32位系统)。

类型名 *指针变量名[=<指针表达式>]
类型名:指针变量用来指向的类型。
*表示定义的是指针变量
例:

int *p;

取地址运算符&
用来返回操作数的地址,与一个变量或者数组元素连用。通过&可以将某一个元素的地址赋给指针。
例:

int a=1;
int *p;
int p=&a;

指针使用之前要先进行赋值,否则不确定。

间接访问运算符*
用来返回操作数所指的变量,与一个指针连用。

二级指针变量
类型名 ** 指针变量名
是指向指针变量的指针。
例:

int a=1;
int *p=&a;
int **pa=&p;

指针数组
类型名 ** 指针数组名[元素个数]
一系列指针变量的集合。每一个元素都是一个指针变量,具有相同的存储类型,指向相同的数据类型。
例:

int *p[2];

由p[0]和p[1]两个指针组成。都指向int类型数据。

指向常量的指针
const 类型名 *指针变量名[=<指针表达式>]
指针所指的对象是常量。(*p不可以修改,p可以修改)。
例:

int a=1;
const int *p=&a;

a不可以通过*p修改,但是可以通过a修改。

指针常量
类型名 * const 指针变量名[=<指针表达式>]
指针(p)不可以再指向其他对象,但是*p内容可以修改。

指针与一维数组
每个数组的起始地址称为数组的指针。一维数组的数组名就是起始地址,是一个指针常量。

int a[10];
int *p;

a与&a[0]等价,所以

p=a;

p=&a[0];

通过指针可以访问数组元素,例如给a[0]赋值为5:

int a[10]={0};
int *p;
p=a;
*p=5;

通过引用可以访问数组元素,例如给a[3]赋值为5:

int a[10]={0);
int *p;
p=&a[3];
*p=5;

无论数组类型如何,如果指针p指向数组一个元素,那么p+1就指向数组下一个元素。
若*p=a[0],那么
*(p+i)=a[i]
p+i和a+i等价,表示数组第i个地址,即&a[i]。
*(p+i)*(a+i)等价,表示数组第i个元素,即a[i]。
p也可以带下标。p[i]与*(p+i)等价,为a[i]。

指针与二维数组
二维数组的数组名表示整个数组的首地址。
a表示a[0]的地址,即&a[0]。a+1表示a[1]的地址,即&a[1]。
所以,a+i表示a[i]的地址,即&a[i],是一个指向一维数组的指针。
a[0],a[1],a[2]是一维数组名,表示一维数组的首地址。
a[0]即是&a[0][0],a[1]是&a[1][0]。a[i]是&a[i][0]。
a[0]+i表示&a[0][i]。
*(a+i)等价于a[i]。
*(a+i)+j等价于a[i]+j,即&a[i][j]。
所以数组元素a[i][j]可以表示为:
(a[i]+j)、((a+i)+j)、(a+i)[j]。

例题
1.下面程序的输出结果是?

include<iostream.h>
 void main()
{     
     int n[][3]={10,20,30,40,50,60};
     int (*p)[3];
     p=n;
     cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl;
}

解:
可以通过下标访问,所以p[0][0]指数组第一个元素,为10。
p[0]指数组第一行的地址,p[0]+1就是p[0][1]的地址为&p[0][1],所以*(p[0]+1)为20。
*p就是p[0],所以(*p)[2]就是p[0][2]为30。

一维数组:
a <=> &a[0]
a+1 <=> &a[1]
*(a+1) <=> a[1]
二维数组:
a[0] <=>&a[0][0]
a[1]+1 <=> &a[1][1]
*a[0] <=>a[0][0]
*(a[1]+1 ) <=> a[1][1]

2.若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是:

1.p=s; 
2.p=k;
3.p=s[0]; 
4.k=s;

解:
p是指向char类型的指针。
s是二维数组首地址,s[0]的地址,是一个指向大小为10的一维数组的指针。
k是char类型,指向大小为3的一维数组的指针。
s[0]是一维数组首地址,表示&s[0][0]。
所以p和s、p和k、k和s的类型不同,1、2和4错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值