指针与数组及函数关系

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)不行)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值