【426】C 传递数组给函数

参考:C 传递数组给函数

参考:C语言二维数组作为函数参数传递

参考:二维数组作为函数参数传递剖析(C语言)(6.19更新第5种)



总结:

一维数组参数,可以是地址、arr[]、arr[n]

二维数组比较复杂,需要提供列的值,否则会报错,可参考上面的网址

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

void myFunc1(int length, int *arr) {
	for (int i = 0; i < length; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");
	return;
}

void myFunc2(int length, int arr[]) {
	for (int i = 0; i < length; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");
	return;
}

void myFunc3(int length, int arr[length]) {
	for (int i = 0; i < length; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");
	return;
}

void myFunc4(int row, int column, int *arr2) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < column; j++) {
			printf("arr2[%d][%d] = %d   ", i, j, *(arr2 + i*column + j));
		}
		printf("\n");
	}
	return;
}

void myFunc5(int row, int column, int arr2[][column]) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < column; j++) {
			printf("arr2[%d][%d] = %d   ", i, j, arr2[i][j]);
		}
		printf("\n");
	}
	return;
}

int main() {
	int arr[5] = {1, 2, 3, 4, 5};

	printf("Parameter is pointer:\n");
	myFunc1(5, &arr[0]);	// ok with arr

	printf("Parameter is array[]:\n");
	myFunc2(5, &arr[0]);	// ok with arr

	printf("Parameter is array[length]:\n");
	myFunc3(5, &arr[0]);	// ok with arr

	int arr2[2][3] = {{1, 2, 3}, {4, 5, 6}};

	printf("Parameter is pointer:\n");
	myFunc4(2, 3, arr2[0]);	// &arr2[0][0] is ok, but arr2 is not ok
							// *arr2 is ok.
							// but actually they have the same address

	printf("Parameter is pointer:\n");
	myFunc5(2, 3, arr2);	// not ok with arr2[0]
							// not ok with &arr2[0][0]

	printf("\narr2                           = %p\n", arr2);
	printf("arr2[0]                        = %p\n", arr2[0]);
	printf("*arr2 = arr2[0]                = %p\n", *arr2);
	printf("arr2[0][0]                     = %p\n", &arr2[0][0]);
	printf("**arr2 = *arr2[0] = arr2[0][0] = %p\n\n", &arr2[0][0]);

	printf("address of this two-dimentional array:\n");
	printf("arr2           = %p\n", arr2);
	for (int i = 0; i < 2; i++) {
		printf("  arr2[%d]      = %p\n", i, arr2[0]);
		for (int j = 0; j < 3; j++) {
			printf("    arr2[%d][%d] = %p   ", i, j, &arr2[i][j]);
		}
		printf("\n");
	}

	printf("we can use the unexisted element, interesting!\n");
	printf("*arr2 means arr2[0], the first row.\n");
	printf("**arr2 means *arr2[0] means arr2[0][0], the first element of the first row.\n");
	printf("arr2[1][0]               = %d\n", arr2[1][0]);
	printf("arr2[0][3]               = %d\n", arr2[0][3]);
	printf("*(*(arr2 + 1) + 0)       = %d\n", *(*(arr2 + 1) + 0));
	printf("*(*(arr2 + 0) + 3)       = %d\n", *(*(arr2 + 0) + 3));
	printf("*(arr2[0] + 1*3 + 0)     = %d\n", *(arr2[0] + 1*3 + 0));
	printf("*(*arr2 + 1*3 + 0)       = %d\n", *(*arr2 + 1*3 + 0));
	printf("*(&arr2[0][0] + 1*3 + 0) = %d\n", *(&arr2[0][0] + 1*3 + 0));
	printf("*(&arr2[0][0] + 3)       = %d\n", *(&arr2[0][0] + 3));

	return 0;
}

output:

Parameter is pointer:
1 2 3 4 5
Parameter is array[]:
1 2 3 4 5
Parameter is array[length]:
1 2 3 4 5
Parameter is pointer:
arr2[0][0] = 1   arr2[0][1] = 2   arr2[0][2] = 3
arr2[1][0] = 4   arr2[1][1] = 5   arr2[1][2] = 6
Parameter is pointer:
arr2[0][0] = 1   arr2[0][1] = 2   arr2[0][2] = 3
arr2[1][0] = 4   arr2[1][1] = 5   arr2[1][2] = 6   

arr2                           = 0x7ffc6bdc38a0
arr2[0]                        = 0x7ffc6bdc38a0
*arr2 = arr2[0]                = 0x7ffc6bdc38a0
arr2[0][0]                     = 0x7ffc6bdc38a0
**arr2 = *arr2[0] = arr2[0][0] = 0x7ffc6bdc38a0

address of this two-dimentional array:
arr2           = 0x7ffc6bdc38a0
  arr2[0]      = 0x7ffc6bdc38a0
    arr2[0][0] = 0x7ffc6bdc38a0       arr2[0][1] = 0x7ffc6bdc38a4       arr2[0][2] = 0x7ffc6bdc38a8
  arr2[1]      = 0x7ffc6bdc38a0
    arr2[1][0] = 0x7ffc6bdc38ac       arr2[1][1] = 0x7ffc6bdc38b0       arr2[1][2] = 0x7ffc6bdc38b4
we can use the unexisted element, interesting!
*arr2 means arr2[0], the first row.
**arr2 means *arr2[0] means arr2[0][0], the first element of the first row.
arr2[1][0]               = 4
arr2[0][3]               = 4
*(*(arr2 + 1) + 0)       = 4
*(*(arr2 + 0) + 3)       = 4
*(arr2[0] + 1*3 + 0)     = 4
*(*arr2 + 1*3 + 0)       = 4
*(&arr2[0][0] + 1*3 + 0) = 4
*(&arr2[0][0] + 3)       = 4

原文地址:https://www.cnblogs.com/alex-bn-lee/p/11236873.html

时间: 2024-08-30 11:06:52

【426】C 传递数组给函数的相关文章

@清晰掉 传递数组给函数

一维数组 传递数组给函数的3个原则 1.函数调用时只需传递数组名. 2.在函数定义中,形参的类型必须与数组的相同,数组的大小不必指定. 3.函数原型必须定义为参数是一个数组. 1 #include <stdio.h> 2 #include <stdlib.h> 3 void sort(int x[], int m); 4 int main() 5 { 6     int i; 7     int marks[5] = {40, 90, 73, 81, 35}; 8       9

Shell 向函数传递 数组

Shell 向函数传递 数组

c语言函数传递数组

1.传递数组,打印不出来 #include <stdio.h> void solve() { printf("%d",x[0]); } int main() { int i; for(i=0;i<n;i++) { scanf("%d",&x[i]); printf("%d\n",x[i]); } solve(); return 0; } [Error] error: `x' undeclared (first use i

值的引用传递、数组作为函数参数

按值传递(按副本传递): 给函数传递变元(参数)时,变元(参数)不会直接传递给函数,二十先制作变元(参数)值的副本,存储在栈上,再使这个副本可用于函数,而不是使用初始值. 例如: #include<stdio.h> void change(int); int main() { int num = 9; change(num); //将num = 9的值复制一份给change中的变量, printf("num = %d\n",num);//change中的值为副本, retu

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

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

C++数组作为函数参数的几个问题(转)

本文需要解决C++中关于数组的2个问题:1. 数组作为函数参数,传值还是传址?2. 函数参数中的数组元素个数能否确定? 先看下面的代码. #include <iostream> using namespace std; void testArrayArg(int a[]) { cout << endl; cout << "in func..." << endl; cout << "array address: &qu

C++中关于二维数组作为函数参数传递的问题

在做数据结构迷宫实验的时候,要生成一个二维数组存储迷宫数据,为了保证程序的模块化,将生成部分单独放进一个函数migongsc()里.大致代码如下: 问题的关键就集中在了如何将主函数中声明的二维数组migong[8][9]传递到自定义函数中去. 耗费了一个晚上的时间,我总共整理出了三种办法: 方法1:模拟编译器寻址(本法来自CSDN博客,原文: http://blog.csdn.net/jatix/archive/2004/08/29/88150.aspx). 大体意思为:将二维数组当作参数的时候

C语言--- 高级指针2(结构体指针,数组作为函数参数)

一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针     结构体:     typedef  struct stu{                          char name[20];                          char sex;                          int age;                    }Student;     Student stu1 = {"zhangsan",'m',23};  

《黑马程序验》数组与函数(C语言)

一.数组的概念 1.一维数组的定义与使用 int array[10];//定义一个一维数组,名字叫array,一共有10个元素,每个元素都是int类型的 array[0] = 20; array[1] = 30; array[9] = 80; 错误写法: //array[10] = 100;//没有 array[10]这个元素 数组在内存中就是一段连续的空间,每个元素的类型是一样的 2.一维数组初始化 int array[10] = { 100, 1, 5, 3, 4, 5, 6, 7, 8,