Loading... ## 1.指针的类型 **常量指针: const 数据类型 * 指针变量名;** > 指向常量的指针 指向数据类型的值不能发生改变 > 数据类型 const * 指针变量名;都是常指针 只是写法不用于 > 这个是一个面试题目 **指针常量: 数据类型 * const指针变量名;** > 指针保存的地址不能发生改变 指向的值可以发生改变 ## 2.指针步长的概念 > 指针的步长和数据类型大小有关系,指针的步长就是 **指针+1** 它内部的值增加多少 ```c++ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> struct Str { int a; double b; }; int main() { int i = 0; int* p = 0; struct Str* pp = 0; ++i; ++p; ++pp; // i = 多少 p = 多少 pp = 多少 printf("%x,%x,%x", i, p, pp); return 0; } ``` ## 3.指针间接赋值 > 通过一个指针修改一个变量的结果 ```c++ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { int a = 10; int* p = &a;// p 获取a变量的地址 printf("a = %d\n", a); *p = 1000; // 利用指针修改了变量a的值 printf("a = %d\n", a); return 0; } ``` ## 4.二级指针和多级指针 > 二级指针是一个指向指针类型的指针 > > 多级指针就是指针多级指针的指针 ```c++ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { int a = 10; // 一级指针是一个* int* p = &a;// 指针p保存了a的地址 // 二级指针是二个* int** pp = &p;// 指针pp 保存了p的地址 // 利用pp和p访问a // *值取指针保存地址的值 printf("pp = %d,p = %d", **pp, *p); // 一级指针: // 指针变量p的类型为int* ,所指向的类型为int, // 储存的值为int类型变量i的首地址,即指针变量p指向了int类型a的内存地址。 // 二级指针: // 指针变量pp的类型为int**, 所指向的类型为int*, 指针变量p的类型为int*, // 所以pp可以指向p的内存地址,即pp保存的是p的首地址,*pp访问到的是p所储存的值,**p访问到的是a的值。 return 0; } ``` ## 5.指针做函数参数的输入输出特性 ### 1.输入特性 **在主调函数中分配内存,被调函数使用** ### 2.输出特性 **被调函数中分配内存,主调函数使用** ```c++ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> // 输入特性 // 传递一个数据给函数内部使用,可以修改或删除 void print(int* p) { printf("%d\n", *p); } // 输出特性 // 在函数内部创建一个内存返回出去 void CreateMem(int** pp) { *pp = malloc(sizeof(int)); } void ReleaseMem(int* p) { free(p); } int main() { int* p; CreateMem(&p); *p = 100; print(p); ReleaseMem(p); return 0; } ``` ## 6.数组指针与指针数组 ```c++ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { // 数组指针 // 数据类型 (*变量名)[数组长度]; // 首先它是一个指针,然后然后指向数组 // 该数组指针指向一维数组 int(*p)[10]; int a[10]; // 数组指针的复制 // 变量名 = 数组的地址 p = a; // 数组指针的使用 //(*变量名)[数组长度] = 值 (*p)[0] = 10; // 指针数组 // 数据类型 *p[数组长度]; // 首先它是一个数组 然后才是一个指针,该数组数组中每个成员都是指针 int* p1[10]; int a1 = 0, a2 = 0, a3 = 0; p1[0] = &a1; p1[1] = &a2; p1[2] = &a3; *(p1[0]) = 10; *(p1[1]) = 20; *(p1[2]) = 30; printf("%d %d %d\n", a1, a2, a3); return 0; } ``` 最后修改:2020 年 06 月 26 日 12 : 20 PM © 允许规范转载