*含义
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 – 字符串
3、指针
指针就是地址. 热身小程序 介绍指针 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);
4、指针与数组
数组名,下标和指针的关系,指针变量的运算 数组名 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)
5、动态分配内存
动态内存分配问题 传统数组的缺点 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; }
6、函数指针
1.定义int (*pf)(int x, int y); 2.赋值 pf = add; 3.引用 pf(3,5);