内存:程序运行过程中,可以访问到的内存存储空间;计算机为了方便对内存的管理,以字节为单位,
对内存进行了编号。
地址:计算机管理内存时,给内存的编号。
指针:指针即为地址,地址即为指针,指针指向了一个具体的空间 。
指针变量:变量,保存地址的变量,需要占用内存空间。
1. 指针基础
① 指针变量的定义
基类型 *变量名;
基类型:该指针指向的空间存储的数据的数据类型
int、char 、float、double、void、构造数据类型
* : 类型说明符,说明后面的变量是一个指针
变量名:遵循标识符的命名规则
p开头
pmax,ptmp….
int *pint;
char *pch;
int *pi,*pj;
指针变量中保存的地址,是该指针指向的数据的首地址。
sizeof(指针);在64位计算机系统下,指针在内存中占用8字节。
在32位计算机系统下,指针在内存中占用4字节。
②指针变量的初始化和赋值
int *p = NULL;
int *p = #
p = #
野指针:未初始化或赋值的一个指针,或者指向一个已经释放的内存空间的指针。
避免野指针:
1. 给指针初始化成空指针NULL(0)。
1. 给指针变量初始化成已有的变量的地址。
③ 指针运算符
* 指针运算符
用来访问指针变量指向的内存空间中的数据
*指针变量;—–》指针降级为变量类型—》基类型的变量
int *p;
p; —->int *
*p; —->int
char *pch;
*pch —->char
【注意】
1. * 指针运算符,只能放在指针变量的前边。
2. *指针变量, 访问指针变量指向的数据,该表达式降级为变量类型—》基类型的变量
3. *指针变量,访问的字节数取决于定义该指针时的基类型,访问sizeof(基类型)字节。
char *p; *p—>char —>访问1字节
int *p; *p—>int —->访问4字节
double *p; *p–>double —->访问8字节
& 取地址运算符
获取某个变量的首地址。
&变量名;
1. &只能给一个变量取地址,不能给常量或者表达式取地址。
2. &给某个变量取地址时,获取的是这个变量首字节的地址。
④指针的算数运算
+ – * / % ++ —
+ * / % 对于指针运算无意义。
– :指针1-指针2:表示两个指针之间间隔的元素个数(地址值之间的字节差/sizeof(基类型))
++ :指针+1 :表示从当前地址向后偏移sizeof(基类型)字节
— :指针-1:表示从当前地址向前偏移sizeof(基类型)字节
char *p; p+1; —-> 向后偏移1字节
int *p; p+1; —-> 向后偏移4字节
2. 指针作为函数参数
1. 被调函数中,想要修改主调函数中定义的变量,必须传递该变量的地址。
2. 被调函数中,想要使用主调函数中定义的变量,可以传递值,也可以传递地址。
3. 被调函数想要返回多个结果时,可以传递主调函数定义的变量的地址,地址指向的空间可以保存被调函数得到的结果。

3. 指针和一维整形数组
数组的数组名为数组的首元素地址,且是一个地址常量。
【注意】数组名为地址常量(右值),不能为其赋值
a ===>&a[0]
a[0] —->*a
a[1] —->*(a+1)
a[2] —->*(a+2)
a[n] —->*(a+n)

一维整形数组作为函数参数传递:
void print_array(int a[ ], int len)
{
}
void print_array(int *pa, int len)
{
}
4. 指针和一维字符型数组的关系
数组的数组名为数组的首元素地址,且是一个地址常量。

char str[32] = {"hello"};
str ===> &str[0] ====> char * ——–> *str ====> str[0]
str+1 ==>&str[1] ====> char * ——–> *(str+1) ==>str[1]
…
str+n ==>&str[n] ====> char * ——–> *(str+n) ==>str[n]
str+1; 指针向内存高地址偏移sizeof(char)字节数
str-1; 指针向内存低地址偏移sizeof(char)字节数
int mystrlen(char str[ ])
{
}
int mystrlen(char *str)
{
}
5. 数组指针
数组指针:本质是指针, 指向数组整体的指针。
语法:
int (*变量名)[5]; —-》数组指针
定义一个指针变量,指针变量自己占8字节空间,可以指向一个具有5个元素的整形数组。
int a[5] = {1,2,3,4,5};
数据类型
a : 首元素地址==》&a[0] ===>int *
&a: 数组的指针=============>int (*)[5];
&a+1 :数组指针+1 ====》代表偏移整个数组(sizeof(a)字节)

【注意】
int a[5] = {1,2,3,4,5};
a :首元素地址—》int *
除了2种场景:
1. sizeof(a/数组名); a不能当作int *类型,当作数组整体,代表整个数组。
2. &a;数组指针,该指针类型为:int (*)[5]; 指向一个数组整体。
6.指针和二维数组
二维数组的数组名是首元素地址,首元素是一维数组,所以二维数组数组名本质是一个一维数组指针。
int a[5] = {1,2,3,4,5};
a 首元素地址 &a[0] int *
a[n] —>*(a+n)
int a[2][3] = {1,2,3,4,5,6};
a 首元素地址 &a[0] int (*)[3];–>数组指针
a[m][n] ===> *(a[m]+n) ===> *(*(a+m)+n)

二维数组的数组名作为函数参数传递:
int a[2][3] = {1,2,3,4,5,6};
void print_2D_array(int a[ ][列数], int hang)
{
}
void print_2D_array(int (*pa)[列数], int hang)
{
}
print_2D_array(a, 2);
char str[3][100] = {"hello", "world", "thanks"};
void print_str_array(char str[][100], int hang)
{
}
void print_str_array(char (*pstr)[100], int hang)
{
}
print_str_array(str, 3);
【练习】用指针传参,输出最大值


【练习】从终端输入两个数,封装一个函数,通过传地址的方式,求这两个数的最大公约数和最小公倍数。



【练习】封装函数,使用指针的方式,实现冒泡排序和选择排序。




【练习】封装函数,使用指针的方式将整型数组逆序。



网硕互联帮助中心
![打卡信奥刷题(3491)用C++实现信奥题 P10734 [NOISG 2019 Prelim] Experimental Charges-网硕互联帮助中心](https://www.wsisp.com/helps/wp-content/uploads/2026/08/20260805014046-6a72949eaf30f-220x150.png)



评论前必须登录!
注册