十二、c++指针 一级指针和二级指针

指针是一种非常方便灵活的东西,原来学c的时候学指针的时候记得课本一堆乱七八糟的注意事项,其实如果只是做做机试题的话根本没那么多用法,就会最基本就行

比如一个例子:

求一个n*4矩阵里面存放的最大元素,

如果知道具体数字,最为初学者就直接两个for循环找到最大的值了。其实这样也不难,多了一个一维大小是未知而已。

#include <iostream>

using namespace std;
int maxvlaue(int array[][4],int k);//注意一下这种忽略可以,但是不能array[4][],
int main()
{
    int a[3][4]={{1,3,4,6},{2,4,6,8},{15,17,34,12}};//声明的方法学一下
    cout<<maxvlaue(a,3)<<endl;
    return 0;
}
int  maxvlaue(int a[][4],int n){
    int i,j,max=a[0][0];
    for(i=0;i<n;i++){
        for(j=0;j<4;j++){
            if(max<a[i][j]) max=a[i][j];
        }
    }
    return(max);
}
现在要求用指针做的话怎么做呢:

#include <iostream>

using namespace std;
int max_value(int(*array)[4],int k);//二级指针
int max_value1(int*arr,int n);//一级指针
int main()
{
int a[3][4]={{1,3,6,7},{2,4,6,8},{15,17,34,12}};
int *b=(int *)a;
cout<<max_value(a,3)<<endl;
cout<<max_value1(b,3*4)<<endl;
    return 0;
}
int max_value(int(*array)[4],int n){
int i,j,max=array[0][0];
for(i=0;i<n;i++){
    for(j=0;j<4;j++){
        if(max<array[i][j])max=array[i][j];//这个指针只看外界的大的维度,每个分量里面是啥它不惯
    }
}
return(max);
}
int max_value1(int*arr,int n){
int i,max=arr[0];
for(i=0;i<n;i++){
        if(max<arr[i])max=arr[i];//这个12个都比,当成一维做
}
return(max);
}


                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

C++中的指针用于存储内存地址,而二级指针则允许我们操作这些地址本身,即可以指向指针。在你的例子中,`void (*(p)[10])(const char)`定义了一个指向函数指针数组的指针,表明它可以指向一个具有10个元素的函数指针集合。 对于二级指针的使用,下面是一个简单的示例: ```cpp // 定义一级指针并初始化 int a = 10; int* p = &a; // 定义二级指针,它指向一级指针 int** pp = &p; // 使用change函数来修改二级指针的内容 void change(int** pp) { // 创建一个新的动态分配的int变量 int* c = new int(20); // 通过二级指针修改一级指针的内容,使它指向新的地址 *pp = c; // 这里的**pp就是p的实际指针值,所以实际上是改变了一级指针指向的内容 } // 调用change函数 change(pp); // 打印结果 cout << "a=" << a << endl; // a仍然指向原来的10 cout << "p=" << *p << endl; // p现在指向新的20 cout << "&a=" << &a << endl; // &a保持不变,因为它是原始变量的地址 cout << "*p=" << *p << endl; // *p显示新的值20 cout << "**pp=" << **pp << endl; // **pp也显示新的值20,因为pp现在指向c // 增强理解,释放动态内存 delete *pp; // 注意删除的是*pp指向的对象,不是pp本身 system("pause"); ``` 这个例子展示了如何通过二级指针间接地更改内存地址,以及如何处理相关的内存管理。相关问题如下: 1. 除了函数指针,还有哪些类型的指针可以用作二级指针? 2. 二级指针在什么情况下会更常用? 3. 动态分配的内存如果不手动释放会发生什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值