1.对于c++的九种内置基本类型来说。在程序中出现该名称,即表示指向该类型的一个变量(或常量等)。通常我们对于变量作为右值,即去变量地址空间的值。但对于数组名和函数名则不同(因为数组的值和函数值很难或无法表示)。如:
int arr[2] = {0, 1}; //c++规定数组名代表指向首元素的地址,即数组名作为右值,取的是第一个元素的地址(如果取数组空间的值很难表示,另外数组名作为指针并不表示该指针开辟空间存储下了),即数组名是一个常量的int型的指针。&arr表示一个指向数组的指针。两者值一样,但类型不同。
#include<iostream>
using namespace std;
int main()
{
int arr[2] = {1, 2};
//if(arr == &arr) //error 类型不匹配
// cout << "equal" << endl;
cout << arr << endl;
cout << &arr << endl;
return 0;
}
输入的结果是一样的。
2.函数上面所述类似,但函数名即表示一个指向该函数类型的一个指针。&func = func = *func c++的这种规定是有一定意义的。原因和数组的规定类似。
#include<iostream>
using namespace std;
void func() { cout << "ok" << endl; }
void (*func2)();//指向函数的指针,函数名是一个const函数指针,那么虽然*func2内容不可以改变,但第二层指针func2可以改变(虽然第一层指针和第二层指针指向的是同一地址,访问权限是和变量名相关的。故虽是一个地址,但用第二层指针可以改变),见下面代码(void (*func2)(){}这样定义是错误的,用函数类型指针去定义一个指针,不能加上该类型的定义体,就想不能int *i = 1;这样定义)。
int main()
{
if(&func == func && func ==*func)
cout << "all equal" << endl;
func2 = &func;
func2 = func;
func2 = *func;
func2();//对于函数名来说,掉用其指针和调用其名称是一样的。
return 0;
}
上面程序可以正确运行。
3.对于typedef void Func(int i);这里Func类型名不在是一个指针而是以具体的函数类型名(对于直接定义的void func()中func是一个指针)。以下初始化赋值是错误的。
typedef void Func();
void func(){}
int main(int argc, char *args[])
{
Func fun = func;
}
因为右边是一个指针,左边定义的是一个函数对象,由于现在还不知道如何直接给一个函数对象赋值,一般会用指针Func *fun = func;
更经常使用的是typedef void (*Func)(int i);
以上说明函数也有类型也可以示例一个对象,体现了一切都是对象的思想(对象都可以去其地址,但对于类型来说不行如&int或&C(C为class)不行)。