一. 指针的操作
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("pa+1 is %p\n",pa+1);