C语言-指针二
一. 指针的操作int main() { int a 10 , b 20, c 30; int *p NULL, *q NULL; p a;//对指针变量p本身进行修改 b *p;//*p为右值表示对变量a的读取 *p 60;//*p为左值表示通过指向的内存空间对变量a的写入 p c;//p指向的内存空间发生变化 b *p;//对c的读取操作 *p 70;//对c的写入操作 q p;//将p的值赋值给q return 0; }二. 函数的传址调用函数的传值调用函数的形参是实参的一份临时拷贝修改形参不会改变实参。函数的传址调用形参是实参的地址形参指向实参的内存地址可以通过形参来改变实参。要使用函数传址调用的两种方式1. 需要形参修改实参的情况。需要被调函数修改主调函数中数据的值。2. 函数的返回值只有一个。 在被调函数中需要返回多个数据的话就需要传递值指针。因为在被调函数中可以修改主调函数的参数值2.1 两数交换void swap(int *pa, int *pb) { int temp *pa; *pa *pb; *pb temp; } int main() { int a 0, b 0; printf(input a and b:); scanf(%d %d,a,b); printf(before a %d,b %d\n,a,b); swap(a,b); printf(after a %d,b %d\n,a,b); return 0; }通过传变量的地址可以使用函数实现两个变量的交换。传值调用则不行因为形参是实参的一份临时拷贝修改形参并不会改变实参。2.2 函数的传出参数使用函数的传址调用也可以在函数内部修改特定的值方便在主调函数中的使用。传出参数给函数一个地址在函数内部对其进行修改之后可以在主调函数中访问。eg使用一个函数计算两数的加减法void func(int a, int b, int *sum, int *sub) { *sum a b; *sub a - b; } int main() { int a 0, b 0, sum 0, sub 0; printf(input a and b:); scanf(%d %d, a, b); func(a, b, sum, sub); // printf(a b %d\n, sum); printf(a - b %d\n, sub); return 0; }三. 指针和数组3.1 指针和数组的关系1. 数组名是一个指向数组第一元素的指针常量(指针本身的值不能发生变化。 指针是保存地址的 变量指针保存的地址不能发生变化)。2. 数组名的类型 int a[]的类型是int []int [ ]约等于int *类型兼容。不同点使用sizeof()计算 int*所占字节大小时结果是8字节。使用sizeof()计算 int a[20] 所占字节大小时结果是80字节。int *p 对p取地址结果是一个二级指针int **(二级指针地址的地址)int a[10] : a 的结果是一个数组指针 int (*p)[10]3. 数组名表示的是数组首元素的地址但是有两个例外(1)、sizeof(数组名)这里计算的是整个数组的大小(2)、数组名这里取出整个数组的地址加一跳过整个数组。3.2 一维整型数组做参数int fill_array(int *a, int size) { int i 0; for(i 0; i size; i) *(a i) rand()%20; return 0; } int show_array(int *a, int size) { int i 0; for(i 0; i size; i) printf(%d ,*(a i)); puts(); return 0; } //冒泡排序 void bubble_sort(int *a, int size) { int i 0, j 0, flag 0; for(i 1; i size; i) { flag 0; for(j 0; j size - i;j) { if(*(a j) *(a j 1)) { int temp *(a j); *(a j) *(a j 1); *(a j 1) temp; flag 1; } } if(!flag) break; } } //选择排序 void chose_sort(int *a, int size) { int i 0, j 0; for(i 0; i size - 1; i) { int min_index i; for(j i 1; j size; j) { if(*(a j) *(a min_index)) min_index j; } if(i ! min_index) { int temp *(a min_index); *(a min_index) *(a i); *(a i) temp; } } } //插入排序 void insert_sort(int *a, int size) { int i 0, j 0; for(i 0; i size - 1; i) { j i 1; int k *(a j); while (j 0 *(a j - 1) k) { *(a j) *(a j - 1); j--; } *(a j) k; } } int main() { srand(time(NULL)); int a[10] { 0 }; int size sizeof(a) / sizeof(a[0]); fill_array(a,size); show_array(a,size); // bubble_sort(a,size); // printf(bubble_sort:); // show_array(a,size); // chose_sort(a,size); // printf(chose_sort:); // show_array(a,size); insert_sort(a,size); printf(insert_sort:); show_array(a,size); return 0; }3.3 一维字符数组做参数void show_array(char *a) { while(*a) { printf(%c,*(a)); } puts(); } int main() { char a[10] { 0 }; printf(input a str:); gets(a); show_array(a); return 0; }3.4 数组指针int a[10] { 0 }; int (*pa)[10] a;这里pa是一个数组指针加一跳过40个字节int a[10]; int (*pa)[10] a; printf(pa is %p\n,pa); printf(pa1 is %p\n,pa1);
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2607236.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!