c语言 第六章上:指针(持续更新中……)
2026/8/5 20:46:12 网站建设 项目流程
内存:程序运行过程中,可以访问到的内存存储空间;计算机为了方便对内存的管理,以字节为单位,
对内存进行了编号。
地址:计算机管理内存时,给内存的编号。
指针:指针即为地址,地址即为指针,指针指向了一个具体的空间 。
指针变量:变量,保存地址的变量,需要占用内存空间。

1.指针基础

指针变量的定义

基类型*变量名;
基类型:该指针指向的空间存储的数据的数据类型
intcharfloatdoublevoid、构造数据类型
*: 类型说明符,说明后面的变量是一个指针
变量名:遵循标识符的命名规则
p开头
pmaxptmp....
int *pint
char *pch
int *pi*pj
指针变量中保存的地址,是该指针指向的数据的首地址。
sizeof(指针);在64位计算机系统下,指针在内存中占用8字节。
32位计算机系统下,指针在内存中占用4字节。

指针变量的初始化和赋值

int *p = NULL;

int *p = &num
p = #
野指针:未初始化或赋值的一个指针,或者指向一个已经释放的内存空间的指针。
避免野指针:
1.给指针初始化成空指针NULL0)。
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; 指针向内存高地址偏移sizeofchar)字节数
str-1; 指针向内存低地址偏移sizeofchar)字节数
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 ====》代表偏移整个数组(sizeofa)字节)

【注意】

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);
【练习用指针传参,输出最大值
练习从终端输入两个数,封装一个函数,通过传地址的方式,求这两个数的最大公约数和最小公倍数。
【练习封装函数,使用指针的方式,实现冒泡排序和选择排序。
练习】封装函数,使用指针的方式将整型数组逆序。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询