基础了解内存程序运行过程中可以访问到的内存存储空间计算机为了方便对内存的管理以字节为单位对内存进行了编号。地址计算机管理内存时给内存的编号。指针指针即为地址地址即为指针指针指向了一个具体的空间。指针变量变量保存地址的变量需要占用内存空间。一指针基础1.指针变量的定义基类型 *变量名基类型该指针指向的空间存储的数据的数据类型int、char、float、double、void、构造数据类型*类型说明符说明后面的变量是一个指针变量名遵循标识符的命名规则一般习惯以p开头例pmax、psum、ptmpsizeof(指针);在64位计算机系统下指针在内存中占用8字节在32位计算机系统下指针在内存中占用4字节。int/char/... *pi,*pj; //定义指针变量,不要忘写*否则为变量指针变量中保存的地址是该指针指向数据中的首地址2.指针变量的初始化和赋值初始化int *p NULL;int *p num;赋值p num野指针未初始化或赋值的一个指针或者指向一个已经释放的内存空间的指针。避免野指针(容易出现段错误)1给指针初始化成NULL本质为0相当于#define NULL (void *)0void *万能指针2给指针变量初始化成已有的变量的地址3.指针运算符* 指针运算符用来访问指针变量指向的内存空间中的数据*指针变量; --- 指针降级为变量类型 --- 基类型的变量int *p;p; ---int **p; ---int注意1*指针运算符只能放在指针变量的前面2*指针变量访问指针变量指向的数据该表达式降级为变量类型---基类型的变量3*指针变量访问的字节数取决于定义该指针时的基类型,访问sizeof(基类型)字节char *p; *p---char ---访问1字节int *p; *p---int ---访问4字节double *p; *p---double ---访问8字节 取地址运算符变量名 //获取某个变量的首地址注意1只能给一个变量取地址不能给常量或者表达式取地址2给某个变量取地址时获取的是这个变量首字节的地址4.指针的算数运算 - * / % -- * / %对于指针运算无意义- 指针1-指针2表示两个指针之间间隔的元素个数地址值之间的字节差/sizeof基类型 指针1表示从当前地址向后偏移sizeof(基类型)字节-- 指针-1表示从当前地址向前偏移sizeof(基类型)字节char *p; p1;---向后偏移1字节int *p; p1;---向后偏移4字节二指针作为传递参数1.被调函数中想要修改主调函数中定义的变量必须传递该变量的地址2.被调函数中想要使用主调函数中定义的变量可以传递值也可以传递地址3.被调函数想要返回多个结果时可以传递主调函数定义的变量的地址地址指向的保存空间可以保存被调函数得到的结果。三指针和一维整型数组数组的数组名为数组的首元素地址。注意1.数组名为地址常量右值不能作为左值为其赋值a a[0]a[0] --- *aa[1] --- *(a1)a[n] --- *(an)一维整型数组作为函数参数传递void print_array(int a[],int len){}orvoid print_array(int *pa,int len){}练习1从终端输入两个数封装一个函数通过传地址的方式求这两个数的最大公约数和最小公倍数#includestdio.h void get_num(int a,int b,int *pgcd,int *plcm) { int i 0,small 0; if(a b) { small b; } else { small a; } for(i small; i 1; --i) //i a b ? b : a; i 0; --i { if(a % i 0 b % i 0) { *pgcd i; break; } } *plcm (a * b) / *pgcd; printf(gcd %d\n,*pgcd); printf(lcm %d\n,*plcm); } int main(void) { int a 0,b 0; int gcd 0,lcm 0; scanf(%d %d,a,b); get_num(a,b,gcd,lcm); return 0; }练习2封装函数使用指针的方式实现冒泡排序和选择排序#includestdio.h void print_array(int *a,int len) { int i 0; for(i 0; i len; i) { printf(%d , *(ai)); } printf(\n); } void bubble_sort(int *a,int len) { int i 0,j 0,t 0; for(j 0; j len-1; j) { for(i 0;i len-1-j; i) { if( *(ai) *(ai1) ) { t *(ai); *(ai) *(ai1); *(ai1) t; } } } } void selection_sort(int *a,int len) { int i 0,j 0,t 0; for(i 0; i len-1; i) { for(j i1; j len; j) { if( *(ai) *(aj) ) { t *(ai); *(ai) *(aj); *(aj) t; } } } } int main(void) { int a[7] {1,3,5,-7,6,2,9}; int len sizeof(a) / sizeof(a[0]); printf(old); print_array(a,len); bubble_sort(a,len); printf(bubble); print_array(a,len); int b[7] {1,3,5,-7,6,2,9}; selection_sort(b,len); printf(selection); print_array(b,len); return 0; }练习3封装函数使用指针将一个整型数组逆序#includestdio.h void reverse(int *a,int len) { int i 0; int t 0; for(i 0;i len/2;i) { t *(ai); *(ai) *(alen-1-i); *(alen-1-i) t; } } void print_array(int *a,int len) { int i 0; for(i 0;i len;i) { printf(%d,*(ai)); } printf(\n); } int main(void) { int a[7] {1,2,3,4,5,6,7}; int len sizeof(a) / sizeof(a[0]); reverse(a,len); print_array(a,len); return 0; }