1 函数名与&
TestCode
#include <stdio.h>
static void test_deleter(void){
printf("%s\n", __FUNCTION__);
}
void main(void){
auto f1 = test_deleter;
auto f2 = &test_deleter;
printf("%s ; %s\n", typeid(f1).name(), typeid(f2).name());
f1();
f2();
(*f1)();
(*f2)();
}
Test Result
void (__cdecl*)(void) ; void (__cdecl*)(void)
test_deleter
test_deleter
test_deleter
test_deleter
Summary
推测对于函数名进行&操作的方法可能属于遗留的问题,非常见的用法;
对于函数名理解为函数类型,对于&函数名理解为函数指针,至于使用还是尽量以正常的思维去思考,函数类型就直接使用,函数指针类型就使用*操作符进行使用。
2 数组名与&
TestCode
#include <stdio.h>
void test_array(void){
int arr[10][10];
printf("arr : {%-10s}\t[%x]\n", typeid(arr).name(), arr);
printf("&arr : {%-10s}\t[%x]\n", typeid(&arr).name(), &arr);
printf("arr[0] : {%-10s}\t[%x]\n", typeid(arr[0]).name(), arr[0]);
printf("&arr[0] : {%-10s}\t[%x]\n", typeid(&arr[0]).name(), &arr[0]);
printf("arr[0][0] : {%-10s}\t[%x]\n", typeid(arr[0][0]).name(), arr[0][0]);
printf("&arr[0][0] : {%-10s}\t[%x]\n", typeid(&arr[0][0]).name(), &arr[0][0]);
}
void main(void){
test_array();
}
Test Result
arr : {int [10][10]} [15fa40]
&arr : {int (*)[10][10]} [15fa40]
arr[0] : {int [10] } [15fa40]
&arr[0] : {int (*)[10]} [15fa40]
arr[0][0] : {int } [cccccccc]
&arr[0][0] : {int * } [15fa40]
Summary
Point 1 首先关于 “数据类型 + 数据名”这种定义,数据名可以理解为某段内存的映射,当通过数据名进行各项操作时其实就是通过名字确定数据的起始地址,通过数据类型确定需要取多少内容
Point 2 对于 int b;这种写法,发现line 1的结果打印的是某段地址,而直接打印b的话是b的内容,这里就需要进行区分数组名和一般变量名。