---恢复内容开始---
指针的运算
指针的本质就是个整数,因此从语法上来说整数能使用的运算符它都能使用。
不是所有的运算符对指针运算都是有意义的。
指针+整数 <=> 指针+宽度*整数 向右移动
指针-整数 <=> 指针-宽度*整数 向左移动
指针-指针 <=> 指针-指针/宽度 计算出两个指针之间相隔多少个元素。
指针与const:
const int* p; 保护指针指向的数据,不能通过指针解引用修改内存的值。
int const *p; 保护指针指向的数据,不能通过指针解引用修改内训的值。
int * const p; 保护指针变量,指针变量初始化之后不能再显式的赋值。
const int *const p; 既不能修改指针的值,也不能修改内存的值。
int const * const p; 既不能修改指针的值,也不能修改内存的值
#include <stdio.h> int main() { const int num = 10; int const *p = # // *p = 100; int * const p1 = # *p1 = 100; p1 = NULL; }
什么是二级指针
A(即B的地址)是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量,
二维指针:指向指针的指针,它是个指针变量,但它存储的是指针变量的地址。
float * p = NULL;
定义:float** pp = &p;
使用:*pp <=> p; **p <=> *p;
函数之间共享普通变量使用一级指针,共享指针变量需要使用二级指针。
#include <stdio.h> #include <stdlib.h> void create_memory(void** p,int size) { *p = malloc(size); } int main() { int* p = NULL; create_memory(&p,40); printf("%p ",p); for(int i=0; i<10; i++) { printf("%d ",p[i]); } }
函数指针:
函数就是存储在代码段中的一段数据,当被调用时跳转到那个位置去执行,而函数名就是这段数据的首地址(函数指针),因此函数名就是个指针。
程序员可以自己定义函数指针来指向函数:
1、写出函数的声明
2、为函数名添加小括号
3、修改函数名,并在函数名前加*
定义好函数指针后就可以指向函数了,通过()就可以调用函数,而不用*解引用。
函数指针真正的作是可以把函数当作参数在函数之间进行传递,然后达到一效果:多年前写的代码来调用现在所定的代码,这种模式叫回调。
指针数组:由指针变量构成的数组。
定义:char* arr[5]; // 定义一个长度为5的数组,成员类型是char*
相当于定义的5个 char* 指针变量,char *p1,*p2,*p3,*p4,*p5;
使用:arr[0] = "hehe"; printf("%s
",arr[i]);
sizeof(arr) => 20个字节
数组指针:专门用来指向数组的指针。
int arr[10];
定义:int (*p)[10] = NULL;
p + 1 => 40;
更多时候用来指向二维数组,当使用二维数组当函数参数时,应该使用数组指针来当形参。
C语言中没有真正的二维数组,是用一维数组模拟的。