type conversion of array and pointer in C(2)
2014-08-18 23:48
369 查看
这两天出去玩了,所以没有写博客,十分惭愧。。。
接上篇内容,上篇讲到了二维数组的类型推导,我们还有一个很重要的地方没有讲,就是函数的传参问题。
归根到底就是:怎么传一个二维数组进函数,怎么在函数中修改传入的数组,怎么在函数中新建一个数组,和怎么返回一个二维数组。
传递参数:
从大类上分,我们可以有以下几种方式传递参数进入函数
直接传递数组,那么函数行参用int a[][],另外需要传数组的行和列进函数。
如果只传数组的首地址进函数,那么有以下2种传法
1. 传int * 型指向数组首地址的指针p,这种时候编译器对p+1翻译为地址加4.
2. 传(int *)[2]型指针指向数组第一行首地址的指针p,这种时候p+1翻译为+8,*p+1翻译为+4.
请看示例代码:
结果:
以上3种方式都能在函数中修改数组内容
接下来是在函数中new一个二维数组:
最后是返回一个数组,事实上,上面已经展示了返回一个数组的一种方式,但这仅用于在函数里new的二维数组返回,因为一般而言,不是new的数组都不能够用int**来指向。
假如说我要返回一个不是在函数里new的二维数组。那么我只有一种返回方式,就是int*,用于保存需要返回的数组的首地址。这样,我们就有了第二种创建二维数组并返回的方法,即new一个一维数组,然后当二维数组来用。
或者如果是返回一个修改过的传入的二维数组,只需要在函数最后加上
至此,有关指针,数组,二维数组的函数传参和返回就讲完了。呼呼~
接上篇内容,上篇讲到了二维数组的类型推导,我们还有一个很重要的地方没有讲,就是函数的传参问题。
归根到底就是:怎么传一个二维数组进函数,怎么在函数中修改传入的数组,怎么在函数中新建一个数组,和怎么返回一个二维数组。
传递参数:
从大类上分,我们可以有以下几种方式传递参数进入函数
直接传递数组,那么函数行参用int a[][],另外需要传数组的行和列进函数。
如果只传数组的首地址进函数,那么有以下2种传法
1. 传int * 型指向数组首地址的指针p,这种时候编译器对p+1翻译为地址加4.
2. 传(int *)[2]型指针指向数组第一行首地址的指针p,这种时候p+1翻译为+8,*p+1翻译为+4.
请看示例代码:
#include <stdio.h> void f1(int a[][2], int row, int col){//n维数组的行参除了第一维可以不写明,其它维都要显式的写出 for (int i =0; i<row; i++){ for(int j = 0; j < col; j++){ printf("%d",a[i][j]); } } printf("\n"); } void f2(int (*p)[2], int row, int col){//n维数组的行参除了第一维可以不写明,其它维都要显式的写出 for (int i = 0; i < row*col; i ++) { printf("%d",*(*p+i)); } printf("\n"); } void f3(int *p, int row, int col){ for (int i = 0; i < row*col; i ++) printf("%d",*(p++)); printf("\n"); } int main(){ int a[3][2] = {1,2,3,4,5,6}; f1(a,3,2); int (*p)[2] = a; f2(p,3,2); int *q = &a[0][0]; //也可以是int *q = *p; int *q = a[0]; f3(q,3,2); }
结果:
以上3种方式都能在函数中修改数组内容
接下来是在函数中new一个二维数组:
#include <stdio.h> int ** f(int row, int col){ int temp = 1; int ** p = new int *[row]; for (int i =0; i<row; i++){ p[i] = new int[col]; } for (int i =0; i<row; i++){ for(int j = 0; j < col; j++){ p[i][j] = temp++; } } return p; } int main(){ int ** p = f(3,2); for (int i =0; i<3; i++){ for(int j = 0; j < 2; j++){ printf("%d", p[i][j]); } } printf("\n"); for(int i=0;i<2;i++) delete [] p[i]; delete [] p; }
最后是返回一个数组,事实上,上面已经展示了返回一个数组的一种方式,但这仅用于在函数里new的二维数组返回,因为一般而言,不是new的数组都不能够用int**来指向。
假如说我要返回一个不是在函数里new的二维数组。那么我只有一种返回方式,就是int*,用于保存需要返回的数组的首地址。这样,我们就有了第二种创建二维数组并返回的方法,即new一个一维数组,然后当二维数组来用。
<pre name="code" class="cpp">int* f(){ int *temp = new int[4]; return temp; }
或者如果是返回一个修改过的传入的二维数组,只需要在函数最后加上
int *p = &a[0][0] return p;或者
int *p = a[0] return p;即可。
至此,有关指针,数组,二维数组的函数传参和返回就讲完了。呼呼~
相关文章推荐
- type conversion of array and pointer in C(1)
- (NOT CLEAR)Question 40: In the declaration below, p is a pointer to an array of 5 int pointers:
- Type difference of character literals in C and C++
- Implicit conversion of an Objective-C pointer to '__autoreleasing instancetype *' (aka '__autoreleas
- array and pointer in c
- php错误 Fatal error: Cannot use object of type stdClass as array in……
- Use the unsinged type as operands of shift operator in C language
- conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
- [main]- ERROR 1037 Operands of Regex can be CharArray only :(Name: Regex Type: null Uid: null)
- EF 6.0 The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value. c#中的时间
- [entity framework ] The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
- Distinguish between index of a decimal number and integer inside an array in Ruby?
- pointer to ref of an array, and to the func that return a ref of an array
- Virtual method and base-type pointer make polymorphism in C++
- how to accepte the array of the checkbox in asp and in php
- Filter (seach and replace) array of bytes in an InputStream
- PHP错误Cannot use object of type stdClass as array in错误的解决办法
- C语言中指针, 数组和字符串(Pointer, Array and String in C Programming Language)
- An instance of getting the maximum and minimum values in an array
- The conversion of a varchar data type to a datetime data type resulted in an out-of-range value