请问代码中,第10、11和12行,分别会输出什么?
一般而言我们会认为,对于任何指针p,表达式*p的含义就是取p的目标,但上题中,这三行的执行结果是:
a: 0x100 p: 0xbffa12e4 *p: 0xbffa12e4(竟然不是0x100 ?!)
这个结果的分析如下:
1,首先,a的值是0x100,这个没什么毛病。
2,其次,p的值是0xbffa12e4是变量a的地址,直接输出,也没什么毛病。毕竟,第8行的代码就是让变量a的地址,存放到指针p里面。
3,再其次,*p的输出结果就有点不可理解了,按道理,*p值得就是p所指向的目标,也就是变量a,那应该输出 0x100 才对,但结果却依然是a的地址,仿佛目标引用符 * 不起作用了?
这道题目的怪异之处是,p 和 *p 是一!样!的!
造成指针的目标引用符失效的原因,在第5行。p的定义说明了p是一个函数指针,函数指针虽然也是指针,但他跟普通的指针有一个极大的区别,那就是指针的目标引用符*,对他是无效的!
换句话讲,假如一个指针指向了一个函数,例如这样:
void somefunc(int a); void (*p)(int a); p = &somefunc;
那么,当我们要使用指针p来引用这个函数somefunc的时候,既可以用普通的方式写上星号来引用,也可以什么都不写,效果完全一样:
(*p)(100); // 相当于调用了函数 somefunc(100); p(100); // 也相当于调用了函数 somefunc(100);
版权所无,欢迎分享,吐槽,转发,点赞。