使用指针形式向函数传递多维数组并在函数内部使用指针形式对多维数组进行引用和修改

定义一个double型二维数组A和另一个同等尺寸的double空二维数组B,编写一个函数将A中的数据复制到B中。并测试该程序。

 1 #include <stdio.h>
 2 void copy_ptr(const double (*s)[12],double (*tar)[12],int row,int col);
 3 int main(void){
 4     const double rain[5][12]={
 5         {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
 6         {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},
 7         {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},
 8         {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},
 9         {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2}
10     },t1[5][12];
11     copy_ptr(rain,t1,5,12);
12     //printf("%.2f",t1[3][8]);
13     return 0;
14 }
15 void copy_ptr(const double (*s)[12],double (*tar)[12],int row,int col){
16     int i,j;
17     for(i=0;i<row;i++){
18         for(j=0;j<col;j++){
19             *(*(tar+i)+j)=*(*(s+i)+j);
20         }
21     }
22 }

函数原型与函数定义中二维数组参数的写法为

double (*s)[12]

这表示函数接受一个指针参数,该指针指向(具有12个double值的数组)。即子数组。

因为子数组本身又是指向每个单个double值的指针,所以此处double (*s)[12]的意义为 “s是一个指针,它指向(步长为1个double,范围为0~11的指针)”,而s的步长为它指向的指针的总范围。

综上,多维数组实际在值的背后,隐含着一个指针树。或者称为指针链也许更为准确。因为在某个地址未被指向时,那根针实际是不存在的,在一个时间点上,从上至下的指针取值路径总是唯一的,所以呈链式。

时间: 2024-10-01 07:07:56

使用指针形式向函数传递多维数组并在函数内部使用指针形式对多维数组进行引用和修改的相关文章

js中函数传递参数,究竟是值传递还是引用传递?

记住真理: js函数传递参数,不管是简单数据类型,还是引用数据类型,都是值传递!! 下面是js红包书里面的例子: function setName(obj) { obj.name = "Nicholas"; obj = new Object(); obj.name = "Greg"; } var person = new Object(); setName(person); alert(person.name); // "Nicholas" 肯定

黑马程序员——c语言学习心得——函数传递二维数组

黑马程序员——c语言学习心得——函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.   变量定义的时候给变量初始化,这是保证不出错的一个很好的习惯.尤其是在指针的使用上,如果我们没有给指针初始化,就会出现野指针,该指针的指向并不是我们所希望的,一旦错误的释放了这个指针,就会发生内存的访问.那么如何初始化指针变量呢,一般有以下几种方法:   1.初始化空指针   int* pInteger=N

通过函数传递二维数组

c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include void func(int n, char  str[ ][5] ) {  int i;  for(i = 0; i < n; i++)   printf("\nstr[%d] = %s\n", i, str[i]); } void main() {  char* p[3];  char str[][5] = {"abc","

二级指针和函数参数——指针参数是如何传递内存的?

1:如果函数的参数是一个指针,不要指望用该指针去申请动态内存.Test 函数的语句 GetMemory(str, 200)并没有使 str 获得期望的内存,str 依旧是 NULL,为什么? void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(str, 100); // str 仍然为 NULL strc

管理线程之向线程函数传递參数

向线程函数传递參数在构造线程对象时就可以完毕.可是要记住,默认情况下是把參数复制到线程内部,即使在函数中使用的是引用.比如 void f(int i,std::string const &s); std::thread t(f,3,"hello"); 上面代码中,函数f的第二个參数是std::string,传递的是char const *会转换为string. 当使用指针指向自己主动变量时.要特别注意: void f(int i, std::string const&

向线程函数传递参数

向线程函数传递参数在构造线程对象时即可完成.但是要记住,默认情况下是把参数拷贝到线程内部,即使在函数中使用的是引用.例如 void f(int i,std::string const &s); std::thread t(f,3,"hello");</span> 上面代码中,函数f的第二个参数是std::string,传递的是char const *会转换为string. 当使用指针指向自动变量时,要特别注意: <span style="font-s

ctypes给扩展模块中的函数传递数组和结构体

传递数组 楔子 下面我们来看看如何使用ctypes传递数组,这里我们只讲传递,不讲返回.因为C语言返回数组给python实际上会存在很多问题,比如:返回的数组的内存由谁来管理,不用了之后空间由谁来释放,事实上ctypes内部对于返回数组支持的也不是很好.因此我们一般不会向python返回一个C语言中的数组,因为C语言中的数组传递给python涉及到效率的问题,python中的列表传递直接传递一个引用即可,但是C语言中的数组过来肯定是要拷贝一份的,所以这里我们只讲python如何通过ctypes给

C语言结构体及函数传递数组参数示例

注:makeSphere()函数返回Sphere结构体,main函数中,调用makeSphere()函数,传递的第一个参数为数组,传递的数组作为指针. 版权声明:本文为博主原创文章,未经博主允许不得转载.

指针参数是如何传递内存的

1.1.5 指针参数是如何传递内存的? 如果函数的参数是一个指针,不要指望用该指针去申请动态内存.如下示例中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么? void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(str, 100); //

luaj luaoc 回调函数传递的一些小总结

问题场景:我们的游戏在支付时,由于第三方支付比较费时,可能在支付的过程中,我们lua写的cocos2dx项目会断网,我们的游戏有自动重连的机制.我就想,如果断线好了以后,支付完成了,那在断网之前传入的回调函数是否能被成功执行到呢? 就在网上发现了这篇文章 http://dualface.github.io/blog/2013/01/01/call-java-from-lua/#lua20function20E79A84E5BC95E794A8E8AEA1E695B0E599A8 , 个人觉得写的