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