![](https://csdnimg.cn/release/download_crawler_static/9365955/bg9.jpg)
q = (int *)1244996;
*q = 2;
printf("%d\n", *q);
printf("%d\n", *(&a+2));
问输出多少?
解析:用栈区的地址对指针进行初始化,可以直接对其进行访问和改写
答案:2 2
18、函数指针和指针函数
指针函数的本质是一个函数,函数都有返回类型(如果不返回,则为无值型),只不过指针
函数返回值是指向某一类型的指针,例如:
int *f(int)
函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针
变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。
如前所述,C 在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的
地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其
他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的
参数。
例如:
int fun(int ,int ); //函数定义
int (*f)(int , int); //函数指针定义
f=&fun; //函数指针指向一个函数
int ans=fun(2,3); //下面三条语句的效果是一样的,注意用函数指针调用函数
//法
ans=(*f)(2,3);
ans=f(2,3);
19、指针数组和数组指针
指针数组是指数组元素全为指针的数组,其本质上是数组,例如:
char *p[3] = {“hello”,”the”,”world”};
则有*p[0] = “hello”, *p[1] = ”the”, *p[2] = ”world”
数组指针是指向数组的指针,根据数组维数的不同,其指向的地址内容也不同,例如
int (*p1)[4] = a[2][4];
此时 p1 指向的是 a[0]的这一行数据整体的地址,p1++则是 a[1]的首地址
20、强制转换和数组指针
例如:int a[2][2] = {{1, 2}, {3, 4}};
int *p = (int *)(&a + 1);
printf("%d\n", *(p - 1));
p = (int *)(a + 1);
printf("%d\n", *(p - 1));