### 地址、指针、指针变量 ```c #include int main(){ int a = 1; int* p;//p指针变量 可以用来存储整型变量的地址 double d = .3; //数据类型 变量名; //数据类型* 变量名; //&取地址符 printf("&a=%d\n", &a); printf("&d=%d\n", &d); //1.使用指针变量存起来 p = &a; printf("p=%d\n", p); //间接访问符 * //*p <=> a *p = 10; printf("*p=%d\n", *p); printf("a=%d\n", a); void* jk; jk = &a; printf("%d\n", *(int *)jk); return 0; } ``` ### 指针与二级指针 ```c #include int main(){ int a = 1; int *p;//一级指针 可以指向一个整型变量的地址 int **q; //二级指针 可以指向一个整型指针变量的地址 p = &a;//a的地址 q = &p;//p的地址 printf("a=%d\n", a); printf("*p=%d\n", *p);//*p <=> a printf("**q=%d\n", **q);//*q <=> p **q <=> a return 0; } ``` ### 指针作为函数形参 ```c #include /* 指针与函数 1.形参是指针变量 2.返回值是指针变量 */ //编写一个函数,传入两个整数/地址,将两个数的值交换 //函数在调用过程中 void swap(int* a, int* b){//值传递 int t; t = *a; *a = *b; *b = t;//使用中间变量交换两个变量的值 printf("swap: %d %d\n", *a, *b); } int main(){ int a, b; a = 1; b = 2; swap(&a, &b); printf("main: %d %d\n", a, b); return 0; } ``` ### 指针与一维数组的关系 ```c #include /* 指针与数组的关系 指针与一维数组 */ int main(){ int nums[] = {1, 2, 3, 4, 5}; //数组在内存中是连续存储 指针变量运算后会得到下一个/前一个 //nums是一个指针 指向自己这个数组的第一个元素 //nums[下标] <=> *(nums+下标) //C语言中只有 *(nums+下标)写法 //编译器会将 nums[下标]翻译成上面这种 int *p; p = nums;//nums、p都可以指向该数组的第一个元素 //p可以进行赋值运算 但是 nums不行 因为他只是一个虚拟的指针 只能使用* printf("%d\n", *nums); printf("%d\n", *(nums+1)); printf("%d\n", *p++);//1 printf("%d\n", *p++);//2 printf("%d\n", *p++);//3 printf("%d\n", *p++);//4 printf("%d\n", *p);//5 return 0; } ``` ### 指针实现一维数组的倒置 ### 指针对字符串/数组进行去重 ### 指针实现字符串的替换