指针功能程序更加简洁高效指针可以直接访问内容空间概念地址为了区分内存中的不同空间编号称为该空间的地址按照字节进行编址16进制。编址的范围取决于计算机的位数总线64位-地址总线64位64对01-8字节可以被寻址的范围 0x0000000000000000 - 0xFFFFFFFFFFFFFFFF(16)1 个十六进制数字0~F 等价 0000 ~ 11114bit指针简单理解为地址指向某空间地址的指针指针有类型且有指向空间大小的含义指针变量 数据类型 *变量名 int *p; int *p, *q; 不要连续定义多个指针变量最好一个一个定义 不指定存储类型默认为auto不初始化为随机值野指针野指针未经初始化的指针或指向已经被释放空间的指针不要使用未经初始化的指针空指针NULLint *p NULL;指针清零空指向内存地址为0x0的空间0x0地址空间只读的不能写所以对空指针取*会程序崩溃指针类型int *p(4字节); char *p4字节; float *p1字节; double *p8字节;不同类型的指针占用空间一样8字节不同类型的指针指向的空间大小不同指针定义指针变量本身p:操作指针变量本身指针指向的空间*p:操作指针变量指向的空间将指针存放到一个变量中用来存放指针的变量称为指针变量8个字节64位计算机-8字节所有类型指针变量都是8个字节64位计算机使用指针变量的值等价与使用某个指针所以也会将某个变量简称为指针指针相关的运算符1.取地址运算符获得变量在内存空间中的地址首地址不能是常量-编译为指令在CPU中 int num 100; num1.只有左值能完成取地址操作常量和表达式不能如int 4个字节取的是第一个字节的地址2.连接的表达式一定有值值为该变量在内存中存放的首地址3.连接的表达式一定有类型类型具有升级的效果 int - int*每次执行程序会重新分配空间每次取地址不一样printf(%p\n, num); // ✅标准打印地址写法2.取*值运算符只有指针类型能够*操作普通变量不行*连接的表达式一定有值值为指针指向的空间以首地址开始指向数据类型大小的数据的值 printf(%d\n, *num);*连接的表达式类型类型具有降级的效果 int* - int*连接的表达式作为左值就是将右边的值放入指向的空间。 *num 200;3.指针的算数运算 - * / %一般为加减加加减减int *p NULL; p p 1; 0x0 - 0x4;向内存高地址偏移指向数据类型大小个字节空间--;向内存低地址偏移指向数据类型大小个字节空间两个指针相减两个地址之前差了多少个数据类型的元素*p,*与同为单目同级别自右到左4.指针的操作对指针变量本身的p本身赋值可以修改指针的指向对指针变量p取*赋值不修改指针的指向而是利用指针修改空间的数据5.指针作为函数参数的作用1.值传递实参将值传递给形参形参改变不会影响实参函数体内想使用外部变量值的时候使用值传递使用指针可以跳出局部变量的作用域2.地址传递实参地址传递给形参形参是实参的指针可以利用形参修改实参的值函数体内想修改函数体外部变量的值使用地址传递利用地址传递可以实现函数返回多个值函数类型 fun(int *pnum1, int *pnum2){tmp *pnum1;*pnum1 *pnum2;*pnum2 tmp;}int a 100;int b 200;fun(a, b);6.指针与数组 数组用来储存指针用来操作数组与指针的关系数组的数组名是指向数组第一个元素的指针常量常量无法被赋值(a, a--, a 1这些属于赋值)或改变改变a可以将数组名a理解为int *型有两种情况不能理解为int *型1.sizeof运算时数组名不能理解为int *型此时为数组所占空间大小不一定是8位2.运算时数组名不能理解为int *型对数组名a进行取*降级为int型取得就是数组一个元素的值*(a 1)取的是数组第二个元素的值p a;p a[0];所以a[n] *(a n) *(p n) p[n]C语言中[]可以搭配指针使用p[n]等价于指针n再取*C语言中1.跨作用域使用指针2.提供了一种间接访问变量的方式特别是一些没有名字的空间如数组7.一维整形数组的传参int a[5];int fun(int array[], int len); //传的也是指针int fun(int array[5]); //传进来其实是个指针不是数组int fun(int *parray, int len); //直接传入指针
郑州网站建设
网页设计
企业官网