
10.指针的常见操作1.指针变量有两方面的意思一个是指针指向的内容数据值一级指针一个是指针变量本身存储的数据地址值2.赋值运算符的左右值p做左值对指针变量本身进行修改 存储某个变量的地址p做右值把p指向的地址赋值给另一个指针这两指针指向同一个变量*p做左值对指针指向的变量写入数据*p做右值读出指针指向的变量的数据eg#includestdio.hint main(){int a20;int b0;int c40;int *pNULL;int *qNULL;pa; //对指针本身进行修改 改变指针指向//对指针指向的数据内容进行操作b*p; //通过地址获取地址中的数据 对a变量的读取*p30;//把需要写入的数据 通过地址写入a变量pc;//p变量本身发生变化改变指针的指向b*p; //对变量c进行读取操作*p100//对变量c进行写入操作qp; //把p指向的地址赋值给qp、q指向同一个变量。多个指针可以指向同一个变量return 0;}11.指针作为参数传参1.函数传递参数值传递在主调函数中实参在被调函数中形参。形参可以读取实参的内容但是不能修改实参的值。地址传递在主调函数中实参在被调函数中形参。形参可以通过间接访问的方式 读写实参的内容。实参和形参都是指针这两个指针中存储的地址值 是同一个变量的地址。2.函数使用指针作为参数的情况需要形参修改实参的情况需要被调函数修改主调函数中参数的值函数的返回值只有一个。在被调函数中需要返回多个数的话就需要传递指针。因为被调函数可以修改主调函数的参数的值。eg1形参修改实参#include stdio.hvoid swap(int a, int b) //值传递{int t 0;t a;a b;b t;}void swap2(int *pa, int *pb) //地址传递{int t 0;t *pa;*pa *pb;*pb t;}int main(){int a 1;int b 3;// swap(a,b);swap2(a, b);printf(a is %d,b is %d\n, a, b);//指针可以指向0-4G任意地址。但是不一定能读写内存有保护机制。//(int*)0x2000 强制类型转换 把2000不当数字看 当地址看int *p (int *)0x2000;}eg2被调函数中需要返回多个数#includestdio.hint func(int a,int b,int*sum,int *sub){*sumab;*suba-b;return 0;}int main(){int a10;int b20;int sum0;int sub0;func(a,b,sum,sub);printf(a is %d, b is %d, sum is %d, sub is %d,a,b,sum,sub);}12.指针和数组的关系数组名是一个指向数组第一个元素的指针常量。数组名是数组首元素地址的别名并没有开8byte空间 是一个指针常量指针本身的值不能发生变化指针保存的地址不能发生变化eg int a[10]对于数组名a来说可以把它想成一个指针变量。本质,a是数组中第一个元素的别名。aa[0]数组名的类型int a[]; 类型 int [] int []约等于int *int []约等于int * C语言中兼容类型大部分情况下可以相互替换都存了变量地址但也有例外。不同点sizeof()int *--8byte ; int a[20]--20*sizeof(int) 80byte在执行取地址操作时int *-(取地址)-int **(二级指针地址的地址)int a[10]-取地址-int (*p)[10](数组指针)一维整形数组做参数int fill_array(int *a,int size) //填充//int fill_array(int a[],int size){int i0;// for(i0;isize;i)// {// a[i]rand()%50;// }for(i0;isize;i){*(ai)rand()%50;}return 0;}int show_array(int a[],int size) //显示{int i0;for(i0;isize;i){printf(%-5d,*(ai)); //ai-int* ; *(ai) a[i] int//printf(%-5d,*(a)); // *a 优先级 * }// while(isize)// {// if(0i%5)// {// printf(\n);// }// printf(%d\t,*(ai));// i;// }printf(\n);return 0;}一维字符数组做参数void show_str(char *a){int i0;// while(0!a[i])// {// printf(%c,a[i]);// i;// }// printf(\n);// while (\0!*(ai))// {// printf(%c,*(ai));// i;// }// printf(\n);while (\0!*a){printf(%c,*(a));}printf(\n);}