*含义程序员
1.乘法 3*5 2.定义指针变量 int * p;//定义了一个名字叫p的变量,可以存放int数据类型的地址 3.指针运算符, //若是p是一个已经定义好的指针变量则*p表示以p的内容为地址的变量
打印数据类型小程序
%d - int %ld – long int %c - char %f - float %lf – double %x – 十六进制输出 int或者long int或者short int %o - 八进制输出 %s – 字符串
三、指针数组
指针就是地址. 热身小程序 介绍指针 int * p; //p是变量的名字, int * 表示p变量的数据类型是存放int类型的地址的数据类型 //int * p; 不表示定义了一个名字叫作*p的变量 // int * p; 应该这样理解: p是变量名, int *是数据类型 ,p变量的数据类型是int* //所谓int * 类型 实际就是存放int变量地址的类型 int i = 3; p = &i; /*1. p保存了i的地址, 所以p指向i 2. p不是i,i也不是p,修改p的值不影响i的值,修改i的值也不会影响p的值 3. 若是一个指针变量指向了某个普通变量, 则 *指针变量 就彻底等同于 普通变量 例子: 若是p是个指针变量,而且p存放了普通变量i的地址则p指向了普通变量i *p 就彻底等同于 i 在全部出现*p的地方均可以替换成i 在全部出现i的地方均可以替换成*p *p 就是以p的内容为地址的变量*/ j = *p; //等价于 j = i; printf("i = %d, j = %d\n", i, j);
四、指针与数组函数
数组名,下标和指针的关系,指针变量的运算 数组名 int a[5] //a是数组名,5是数组的大小,元素个数 int a[3][4] // 3行4列 a[0][0]就是数组的第一个元素 Int b[5] A=b ;//错误 一维数组名是个指针常量,它存放的是一维数组第一个元素的地址 int a[5]; int a[3][4]; printf("%#X\n",&a[0]); printf("%#X\n",&a); 下标和指针的关系 若是p是个指针变量 则p[i] 等价于 *(p+i)
五、动态分配内存spa
动态内存分配问题 传统数组的缺点 1.数组长度必须实现指定, 而且只能是常整数. int a[5]; int len; int a[len];//error 2.传统形式的数组,程序员无法手动释放空间 数组一旦定义,系统为该数组分配的空间一直存在 函数运行完毕,数组的空间就被释放 3.数组的长度不能在函数运行中动态增长或者缩小 4.A函数定义的数组只有在A没执行完毕前被使用,a函数运行完毕后,a的数组就没法被其余函数使用
# include <stdio.h> # include <malloc.h> //不能省 malloc 是 memory(内存) allocate(分配)的缩写 int main(void) { int i = 5; //分配了4个字节 静态分配 11 行 int * p = (int *)malloc(4); //12行 /* 1. 要使用malloc函数,必须添加malloc.h这个头文件 2. malloc函数只有一个形参,而且形参是整型 3. 4表示请求系统为本程序分配4个字节 4. malloc函数只能返回第一个字节的地址 5. 12行分配了8个字节, p变量占4个字节, p所指向的内存也占4个字节 6. p自己所占的内存是静态分配的, p所指向的内存是动态分配的 */ *p = 5; //*p 表明的就是一个int变量, 只不过*p这个整型变量的内存分配方式和11行的i变量的分配方式不一样 free(p); //freep(p)表示把p所指向的内存给释放掉 p自己的内存是静态的,不能由程序员手动释放,p自己的内存只能在p变量所在的函数运行终止时由系统自动释放 printf("你们好!\n"); return 0; }
1.定义int (*pf)(int x, int y); 2.赋值 pf = add; 3.引用 pf(3,5);