c语言 第六章上:指针(持续更新中……)

发布时间:2026/8/5 20:46:20
c语言 第六章上:指针(持续更新中……) 内存程序运行过程中可以访问到的内存存储空间计算机为了方便对内存的管理以字节为单位对内存进行了编号。地址计算机管理内存时给内存的编号。指针指针即为地址地址即为指针指针指向了一个具体的空间 。指针变量变量保存地址的变量需要占用内存空间。1.指针基础①指针变量的定义基类型*变量名基类型该指针指向的空间存储的数据的数据类型int、char、float、double、void、构造数据类型* 类型说明符说明后面的变量是一个指针变量名遵循标识符的命名规则p开头pmaxptmp....int *pintchar *pchint *pi*pj指针变量中保存的地址是该指针指向的数据的首地址。sizeof(指针)在64位计算机系统下指针在内存中占用8字节。在32位计算机系统下指针在内存中占用4字节。②指针变量的初始化和赋值int *p NULLint *p nump #野指针未初始化或赋值的一个指针或者指向一个已经释放的内存空间的指针。避免野指针1.给指针初始化成空指针NULL0。1.给指针变量初始化成已有的变量的地址。③指针运算符* 指针运算符用来访问指针变量指向的内存空间中的数据*指针变量-----》指针降级为变量类型---》基类型的变量int *p;p; ----int **p; ----intchar *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; p1; ----向后偏移1字节int *p; p1; ----向后偏移4字节2.指针作为函数参数1.被调函数中想要修改主调函数中定义的变量必须传递该变量的地址。2.被调函数中想要使用主调函数中定义的变量可以传递值也可以传递地址。3.被调函数想要返回多个结果时可以传递主调函数定义的变量的地址地址指向的空间可以保存被调函数得到的结果。3.指针和一维整形数组数组的数组名为数组的首元素地址且是一个地址常量。【注意】数组名为地址常量右值不能为其赋值a a[0]a[0] ----*aa[1] ----*(a1)a[2] ----*(a2)a[n] ----*(an)一维整形数组作为函数参数传递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]str1 str[1] char * -------- *(str1) str[1]...strn str[n] char * -------- *(strn) str[n]str1 指针向内存高地址偏移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];a1数组指针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] ---*(an)int a[2][3] {1,2,3,4,5,6};a首元素地址a[0] int (*)[3];--数组指针a[m][n] *(a[m]n) *(*(am)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);【练习】用指针传参输出最大值【练习】从终端输入两个数封装一个函数通过传地址的方式求这两个数的最大公约数和最小公倍数。【练习】封装函数使用指针的方式实现冒泡排序和选择排序。【练习】封装函数使用指针的方式将整型数组逆序。