指针做参数的动态内存分配与二重指针(下)

要实现指针作为函数形参,改变实参指针的值。一般有两种做法:

  1. 使用双指针,或者指针数组形式作为形参,将实参的地址传入函数,也即要给形参传入指针的地址!

    http://blog.csdn.net/liuyajun2013/article/details/17151309#0-tsina-1-79483-397232819ff9a47a7b7e80a40613cfe

    http://www.cnblogs.com/heat-man/p/4646051.html

    http://www.jb51.net/article/37516.htm

  2. 利用返回指针的函数直接返回分配好内存的地址(动态(堆)内存分配你懂的)

接上篇:为一个m行n列的二维数组开辟空间输入各元素的值,再然后输出。

方法一:直接分配一块连续的空间存放m * n个元素:

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int main()
{
    void Input(int *pointer_1, int *pointer_2);      //输入行列
    int *allocation(int dimention);                  //分配内存
    void Output(int *pointer, int line, int column); //输出各元素值

    int m, n;
    int *pointer_counterpart;

    Input(&m, &n);
    pointer_counterpart = allocation(m * n);
    Output(pointer_counterpart, m, n);

    free(pointer_counterpart);
    return 0;
}
void Input(int *pointer_1, int *pointer_2)
{
    printf ("Please input the line & column:\n");
    scanf ("%d%d", pointer_1, pointer_2);
}
int *allocation(int dimention)
{
    int *pointer;
    printf ("Please input %d numbers:\n", dimention);
    pointer = (int*)malloc(dimention * sizeof(int));   //分配了一块连续的空间
    memset(pointer, 0, dimention);
    for (int i = 0; i < dimention; ++i) {
        scanf ("%d", pointer + i);
    }
    return pointer;
}
void Output(int *pointer, int line, int column)
{
    int *pointer_copy;
    pointer_copy = pointer;
    printf ("The matrix is:\n");
    for (int i = 0; i < line; ++i) {
        for (int j = 0; j < column; ++j) {
            printf ("%d ", *pointer_copy++);   //这种表达方式很好
        }
        printf ("\n");
    }
    pointer_copy = pointer;

}

方法二:连续分配m块连续的空间各存放 n个元素:

#include <stdio.h>
#include <stdlib.h>

int **pointer_counterpart;           //要定义此全局变量
int main()
{
    void Input(int *pointer_1, int *pointer_2);
    void allocation(int line, int column);
    void display(int **pointer, int line, int column);
    void free_pointer(int **pointer, int line);

    int m, n;
    //int *pointer_counterpart[line];

    Input(&m, &n);
    allocation(m, n);
    display(pointer_counterpart, m, n);
    free_pointer(pointer_counterpart, m);
    //pointer_counterpart =

    return 0;
}
void Input(int *pointer_1, int *pointer_2)
{
    printf ("Please input the line & column:\n");
    scanf ("%d%d", pointer_1, pointer_2);
}
void allocation(int line, int column)
{
    //int **pointer;  ///二重指针多与指针数组一同使用
    int *pointer_array[line];

    for (int i = 0; i < line; ++i) {
        pointer_array[i] = (int*)malloc(column * sizeof(int));
    }
    printf ("Please input %d *%d numbers:", line, column);
    for (int i = 0; i < line; ++i) {
        for (int j = 0; j < column; ++j) {
            scanf ("%d", pointer_array[i] + j);
        }
    }
    //pointer = pointer_array;
    pointer_counterpart = pointer_array;      ///全局变量指针指向了指针数组的首地址
}
void display(int **pointer, int line, int column)
{
    printf ("The matrix is:\n");
    for (int i = 0; i < line; ++i) {
        for (int j = 0; j < column; ++j) {
            printf ("%d ", *(pointer[i] + j));
        }
        printf ("\n");
    }
}
void free_pointer(int **pointer, int line)
{
    for (int i = 0; i < line; ++i) {
        free(pointer[i]);
    }
}
时间: 2024-10-12 02:29:57

指针做参数的动态内存分配与二重指针(下)的相关文章

指针做参数的动态内存分配与二重指针(上)

C中的动态内存分配问题: 格式:Int *pointer; Pointer = (int *)malloc(100 * sizeof(int)); 可以在被调用函数(该函数返回指针的函数)中动态分配内存,(并且该内存是分配在堆内存中的,故而被调函数可以返回指向该堆内存的指针),然后返回该指针值,该指针指向动态分配的内存,然后可以在主函数中free掉pointer.哪怕在主函数中将该指针值赋值给pointer_2,free掉pointer_2也是可以的,(可以理解的,它们都指向该堆内存),以避免出

C++学习笔记(十一):void*指针、类型转换和动态内存分配

void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void*表示“空类型指针”,与void不同,void*表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”. 类型转换 C风格转换: 1 int i; 2 double d; 3 4 i = (int) d; 5 //或 6 i = int (d); C风格转换在C++中

C和C指针小记(十六)-动态内存分配

动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. 3)如果输入数组的数据超过来数组的容纳范围,程序必须以一种合理的方式作出响应.但是程序员一般不会做这个判断. 1.2 malloc 和 free malloc 和 free 分别用于执行动态分配内存和释放. stdlib.h 中声明来这两个函数的原型 void malloc( size_t siz

2015.12.14 宏定义 枚举 动态内存分配

宏定义 (#define) 宏定义的意义和用途:(习惯上,都是“k”开头) 1.为了让一些数据有意义. 2.类似于内联函数(使用简便). 3.输出日志的开关. (非零即真,0为“发布阶段”,1为“开发阶段”) 枚举 (enum) 枚举类型声明为一组相关的符号常数定义了一个类型名称.枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定. 默认情况下,枚举中每个元素的基础类型是 int.可以使用冒号指定另一种整数值类型.默认是从0开始,后者会在前者之上+1. 动态内

指针 &amp;&amp; 动态内存分配

C++中的动态内存分配机制 c++中使用new和delete来完成在堆上对动态内存的分配和释放. 注.所有指针都应该被初始化 如果指针指向的动态内存被释放或没有指向合法的地址,就应该将指针设置为nullptr,否则内存泄漏. 变量: double* pvalue {}; pvalue=new double; *pvalue=9.0; 或 double* pvalue {}; pvalue=new double {9.0}; 或合并为一句 double* pvalue {new double{9.

C和指针 (pointers on C)——第十一章:动态内存分配(上)

第十一章 动态内存分配 数组在声明的时候,本身作为一个指针常量,它在编译时候内存就已经被分配好了.但是有时候程序不知道这个数组到底有多长,所以,为了防止内存的浪费,C提供了动态内存分配的策略. 其实,作为独立的一章,本章显得内容不多.malloc,free,calloc,realloc就没有了,但是它包含很多用法,也有很多陷阱. 总结: malloc和calloc函数都用于动态分配一块内存,并返回一个指向该块内存的指针.malloc返回的是一个 void *的指针. malloc的参数就是需要分

动态内存分配与指向它的指针变量

1.动态内存分配的含义 c语言允许建立动态内存分配区域,以存放一些临时用的数据,这些数据不必再程序的声明部分定义,也不必等到函数结束时才释放,而是要随时开辟,不需要随时释放,这些数据是临时存放在一个特定的自由存储区(堆),可以根据需要向系统申请所需要大小的空间,由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用. 2.建立内存的动态分配 对内存的动态分配是通过系统提供的函数库来实现的,主要有malloc,calloc,free,realloc这四个

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ

继承和动态内存分配

假设基类使用了动态内存分配,而且定义了析构函数.复制构造函数和赋值函数,但是在派生类中没有使用动态内存分配,那么在派生类中不需要显示定义析构函数.复制构造函数和赋值函数. 当基类和派生类采用动态内存分配时,派生类的析构函数.复制构造函数.赋值运算符都必须使用相应的基类方法来处理基类元素.这种要求是通过三种不同的方式来满足的.对于析构函数.这是自动完成的,也就是说在派生类的析构函数中无需显示调用基类的析构函数.对于构造函数,这是通过在初始化成员类别中调用基类的复制构造函数来完成的,如果不这样做,将