00 包目前CLion的最新版本还不支持中文,需要导入#include <stdlib.h> ,再在main函数内写system("chcp 65001");才能在代码中用中文stdlib 还可以提供动态内存分布——malloc函数01 使用原因对于函数,在函数外定义的变量,函数内进行的运算不会影响函数外变量大小;定义 int b=n; b 改变时,n不会改变为了让改变同时发生,我们需要指针02 定义,格式指针: 也是一种定义变量的方式,指针变量被用来存储另一个变量的地址,通过地址来操作数据格式: 你要存储的变量地址的类型 *指针变量名;//=&取地址变量名//int m =10; 定义了一个整数型指针 它可以存储一个整数型变量的内存地址:int *pm = &m;03 语法01 改变值指针操作: 如何通过指针变量操作它存储的地址中的数据 *指针变量 = 值;!!! *a++; 错误 *a=*a+1; 正确 !!!!!! 定义指针变量 int *pm=&m; 函数:void add(int *a){ *a=*a+1;} int n=0; add(&n); !!!02 不同的输出结果输出变量名==输出*指针变量名==变量值输出&变量名==输出指针变量名==指针变量数据存储的地址编码==变量内存地址04 与数组结合01 相关知识**计算机操作的基本单位是byte**数组的储存地址是连续的,间隔由变量单位大小决定,如int间隔4,char间隔1输出 *数组变量名==数组第0号变量值 输出 *(数组变量名+i)==数组第i号变量值输出 数组变量名==输出 &数组变量名== 输出&数组变量名[0]==数组第一个变量的储存地址数组变量名 也相当于一个指针,因此通用一些操作C语言的函数 不支持直接返回数组 int[] test(){}不合法解决方法: 可以使用指针来存储数组的地址 进行返回(!!返回值为指针时写 int*!! )02 试错int* createArray(int n) { //创建函数,返回值为int指针,参数为一个int变量 int arr[n]={0,10,20}; //创建数组arr // for(int i=0;i<10;i++) { // printf("%d\n",arr[i]); // } return arr; //返回值为指针int* arr } int main() { int* parr=createArray(10); //创建指针 int*parr=数组存储地址 for(int i=0;i<10;i++) { printf("%d\n",parr[i]);//输出数组存储的数据 } }结果无论是本代码还是输出*parr都会导致崩溃,注释化的输出数组元素仍然可以正常运行(可以CLion和DEV C++一起用找错),原因是:变量的生命周期(有界性):定义一个变量之后 它在什么时候会消失? 在该变量定义的大括号范围之外就不能使用了arr是函数内定义的变量,函数外无法调用03 解决方式 动态数组使用内存分配函数,相当于在内存中分配一块空间用于储存数据,不会因有界性而失效格式:数据类型 *数组名=(数据类型*)malloc(内存大小);注意:内存单位为byte,因此对不同类型的数据需要分配不同大小的内存,例如 int n; malloc(n*4);int* createArray(int n) { int *arr =(int*) malloc(n*4); // arr 是一个指针,存储的是一整块内存空间的首地址 指针相当于数组 // 使用内存分配函数分配一块内存(长n*4)给一个指针,充当一个数组 for (int i=0;i<5;i++) { *(arr+i)=i*5; //进行了初始化,非必要 } //arr[i]=i*5; 也可,数组指针通用操作 return arr; } int main() { int* parr=createArray(10); //把创建的指针*arr的地址赋值给*parr for(int i=0;i<10;i++) { //指针数组通用操作 printf("%d\n",parr[i]); //*(parr+i)也可 } }04 扩展 字符串字符串也是一种数组,因此支持通用操作char name[10];scanf("%s",&name[0]);scanf("%s",name);scanf("%s",&name); //三者作用相同char *cp = (char*) malloc(10);scanf("%s",cp); //与指针结合
00 包目前CLion的最新版本还不支持中文,需要导入#include <stdlib.h> ,再在main函数内写system("chcp 65001");才能在代码中用中文stdlib 还可以提供动态内存分布——malloc函数01 使用原因对于函数,在函数外定义的变量,函数内进行的运算不会影响函数外变量大小;定义 int b=n; b 改变时,n不会改变为了让改变同时发生,我们需要指针02 定义,格式指针: 也是一种定义变量的方式,指针变量被用来存储另一个变量的地址,通过地址来操作数据格式: 你要存储的变量地址的类型 *指针变量名;//=&取地址变量名//int m =10; 定义了一个整数型指针 它可以存储一个整数型变量的内存地址:int *pm = &m;03 语法01 改变值指针操作: 如何通过指针变量操作它存储的地址中的数据 *指针变量 = 值;!!! *a++; 错误 *a=*a+1; 正确 !!!!!! 定义指针变量 int *pm=&m; 函数:void add(int *a){ *a=*a+1;} int n=0; add(&n); !!!02 不同的输出结果输出变量名==输出*指针变量名==变量值输出&变量名==输出指针变量名==指针变量数据存储的地址编码==变量内存地址04 与数组结合01 相关知识**计算机操作的基本单位是byte**数组的储存地址是连续的,间隔由变量单位大小决定,如int间隔4,char间隔1输出 *数组变量名==数组第0号变量值 输出 *(数组变量名+i)==数组第i号变量值输出 数组变量名==输出 &数组变量名== 输出&数组变量名[0]==数组第一个变量的储存地址数组变量名 也相当于一个指针,因此通用一些操作C语言的函数 不支持直接返回数组 int[] test(){}不合法解决方法: 可以使用指针来存储数组的地址 进行返回(!!返回值为指针时写 int*!! )02 试错int* createArray(int n) { //创建函数,返回值为int指针,参数为一个int变量 int arr[n]={0,10,20}; //创建数组arr // for(int i=0;i<10;i++) { // printf("%d\n",arr[i]); // } return arr; //返回值为指针int* arr } int main() { int* parr=createArray(10); //创建指针 int*parr=数组存储地址 for(int i=0;i<10;i++) { printf("%d\n",parr[i]);//输出数组存储的数据 } }结果无论是本代码还是输出*parr都会导致崩溃,注释化的输出数组元素仍然可以正常运行(可以CLion和DEV C++一起用找错),原因是:变量的生命周期(有界性):定义一个变量之后 它在什么时候会消失? 在该变量定义的大括号范围之外就不能使用了arr是函数内定义的变量,函数外无法调用03 解决方式 动态数组使用内存分配函数,相当于在内存中分配一块空间用于储存数据,不会因有界性而失效格式:数据类型 *数组名=(数据类型*)malloc(内存大小);注意:内存单位为byte,因此对不同类型的数据需要分配不同大小的内存,例如 int n; malloc(n*4);int* createArray(int n) { int *arr =(int*) malloc(n*4); // arr 是一个指针,存储的是一整块内存空间的首地址 指针相当于数组 // 使用内存分配函数分配一块内存(长n*4)给一个指针,充当一个数组 for (int i=0;i<5;i++) { *(arr+i)=i*5; //进行了初始化,非必要 } //arr[i]=i*5; 也可,数组指针通用操作 return arr; } int main() { int* parr=createArray(10); //把创建的指针*arr的地址赋值给*parr for(int i=0;i<10;i++) { //指针数组通用操作 printf("%d\n",parr[i]); //*(parr+i)也可 } }04 扩展 字符串字符串也是一种数组,因此支持通用操作char name[10];scanf("%s",&name[0]);scanf("%s",name);scanf("%s",&name); //三者作用相同char *cp = (char*) malloc(10);scanf("%s",cp); //与指针结合