指针高级(3)

11.利用指针遍历第二种

不同:

第一种格式,因为是一起定义的,所以所有的数据在内存当中,都是连续的,且二维数组里面存的东西,完全不同

第一种格式,真的是把一维数组那个整体给放进来了,第二种格式当中,一维数组在外面,是把一维数组数组的指针放到了二维数组中,说白了,二维数组里面存的不是数据,仅仅是2个内存而已

代码

#include<stdio.h>
int main()
{
        //1.定义3个一维数组
        int arr1[5] = { 1,2,3,4,5 };
        int arr2[5] = { 11,22,33,44,55 };
        int arr3[5] = { 111,222,333,444,555 };

        //2.把3个一维数组的内存地址,再放入这个二维数组当中
        int* arr[3] = { arr1,arr2,arr3 };

        //3.获取指针
        int** p = arr;

        //4.遍历数组
        for (int i = 0; i < 3; i++)
        {
                for (int j = 0; j < 5; j++)
                {
                        printf("%d ", *(*p +j));
                }
                //换行
                printf("\n");
                //移动指针
                p++;
        }




        return 0;




}

12.数组指针和指针数组

13.函数指针

#include <stdio.h>

void method1();
int method2(int num1, int num2);

int main()
{
        //定义指针指向2个函数
        void (*p1)() = method1;
        int (*p2)(int,int) = method2;

        //2.利用函数指针去调用函数
        p1();
        int num = p2(10, 20);
        printf("%d\n", num);

        return 0;



}

void method1()
{
        printf("method1\n");
}

int method2(int num1, int num2)
{
        printf("method2\n");
        return num1 + num2;
}
### 高级指针的概念与使用方法 #### 函数指针 函数指针是一种特殊的指针类型,它指向的是函数而非数据。通过函数指针,程序可以在运行时动态决定调用哪个函数,这在实现回调机制或其他复杂逻辑时非常有用。 例如,在C语言中定义并使用函数指针的方式如下所示: ```c #include <stdio.h> void funcA() { printf("Function A\n"); } void funcB() { printf("Function B\n"); } int main() { void (*funcPtr)(); // 声明一个指向返回值为空的函数指针 funcPtr = &funcA; // 将函数指针赋值为 funcA 的地址 funcPtr(); // 调用 funcA() funcPtr = &funcB; // 修改函数指针为 funcB 的地址 funcPtr(); // 调用 funcB() return 0; } ``` 这种灵活性使得函数指针成为构建模块化和可扩展软件的重要工具[^4]。 #### 成员函数指针 (C++) 在C++中,类的成员函数也有对应的指针形式。然而,由于成员函数通常依赖于特定的对象实例(即`this`指针),因此它们的处理方式比普通函数更复杂。 下面是一个简单的例子展示如何声明和使用非静态成员函数指针: ```cpp class MyClass { public: int value; MyClass(int v):value(v){}; void displayValue(){ std::cout << "The Value is : "<< this->value<<std::endl; } }; typedef void(MyClass::*MemberFuncPtr)(); int main(){ MemberFuncPtr ptrToMemFunc=&MyClass::displayValue; MyClass obj(10); (obj.*ptrToMemFunc)(); return 0; } ``` 这里需要注意的是语法 `(obj.*ptrToMemFunc)` 中的小圆点操作符 `*` 和箭头的区别在于对象是否已经存在或者只是作为指针传递给另一个结构体或类。 #### 动态内存管理中的高级技巧 除了基本的新建 (`new`) 和删除 (`delete`) 外,还可以利用智能指针来自动管理堆上分配的对象生命周期,从而减少手动释放资源带来的风险。标准库提供了诸如 `unique_ptr`, `shared_ptr` 等模板类用于简化这些过程[^3]。 ```cpp #include <memory> #include <iostream> struct Foo{ ~Foo(){std::cout<<"Destructor Called"<<std::endl;} }; int main(){ auto foo=std::make_unique<Foo>(); } // 当离开作用域时,“Destructor Called”会被打印出来 ``` 上述代码片段展示了现代C++推荐的做法——借助RAII原则让编译器替我们完成必要的清理工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值