指针

  1. 指针数组与数组指针
    1. 指针数组
    2. 数组指针
  2. 函数指针
    1. 结合函数指针,用函数的硬编码直接使用函数的功能
char* a = "hello";
char b[] = "hello";

上面两个变量的区别:

上面一句产生的效果是,将常量”hello”的首地址赋给a;下面一句产生的效果是把字符串”hello”整体复制一份给b。因此,不能通过a对字符串进行修改,即只能读不能改;而b中的值已经复制到堆栈中了,可以修改。

指针数组与数组指针

用int类型举例。

指针数组

int* a[5];

里面存储的内容是一些指针,都是int *类型的。

数组指针

int (*a)[5];

里面存储的内容是一些指向某个数组首地址的指针。

类型名为*int ()[5]*,也带,故宽度为4。变量名是a,这个变量里面存储了一个值,指向一个数组。

a = (int (*)[5])10;
//类型不相同赋值,强转
a++;
//去掉*后,剩下int [5],宽度为20,故a++后变为30。

赋值:

int a[10] = {1,2,3,4,5,6,7,8,9,10};

int (*px)[2];

px = (int (*)[2])a;
printf("%d",*(*(px)));//等同于px[0][0]
//*b代表数组a的首地址,*(*(b))代表第一个元素,故输出1

printf("%d \n",*(*(px+2)+2) );
printf("%d \n",px[2][2]);
//都输出7

数组指针本质上还是指针,所指向的类型不是定死的,一维二维多维数组、其它类型数据都可以指,但指向非数组类型数据就没有实际的意义(比如一个int型整数),要注意这点。

函数指针

int Fun(int x, int y){
    return x+y;
}
int main(){
    int (*pFun)(int, int);
    pFun = Function;
    int a = pFun(1,2);
    printf("%d ",a);
    //输出3
}

定义格式:*int (pFun)(int, int);

pFun为变量名,前面的int表示指向的函数的返回类型,后面的**(int, int)**表示传入的参数类型。pFun同样也是指针类型,所以指向的类型不固定,但指向非函数类型的没有实际意义。

结合函数指针,用函数的硬编码直接使用函数的功能

int Fun(int x,int y){
    return x+y;
}
int main(){
    int x = Fun(1,2);
    printf("%d ",x);
    return 0;
}

实现上面函数的功能:

char a[] = {0x55,
0x8B,0xEC,0x83,0xEC,0x44,
0x53,0x56,0x57,0x8D,0x7D,
0xBC,0xB9,0x11,0x00,0x00,
0x00,0xB8,0xCC,0xCC,0xCC,
0xCC,0xF3,0xAB,0x8B,0x45,
0x08,0x03,0x45,0x0C,0x5F,
0x5E,0x5B,0x8B,0xE5,0x5D,
0xC3};
//获取对应函数的硬编码

int main(){
    int (*pFun)(int, int); 
    pFun = (int (*)(int,int))&a;
    int x = pFun(1,2);

    printf("%d ",x);
    return 0;
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1666739907@qq.com
github