C语言中数组变量作为函数参数传值的两种方式:数组类型 指针类型 以及“C语言中数组变量(名)的本质是指针变量”
创始人
2024-05-19 21:05:08
0

文章目录

    • Intro & Summary
    • Code & Output
      • 运行截图
      • Code
    • 关于数组长度在被调函数中的计算错误
      • 运行截图 & 警告信息
      • Code
    • 数组变量是一类特殊的、指向自己的指针变量

Intro & Summary

我在 main 函数中定义了一个数组,要将该数组作为参数传递给其他方法。那么被调用的方法如何声明?
两种:

void printArray1(int pArr[], int length);	// 数组变量的方式
void printArray2(int* pArr, int length);	// 指针变量的方式【推荐】int main() {int array[] = {11, 22, 33, 44, 55};int length = sizeof(array) / sizeof(array[0]);printArray1(array, length);printArray2(array, length);return 0;
}

注意,C语言中数组作为函数参数时,数组长度无法在被调用函数中计算,所以必须在该函数的参数列表中同时传入数组的长度

另,记一句结论:C语言中数组变量(名)的本质其实是一个指针变量。

数组变量是一类特殊的、指向自己的指针变量

Code & Output

运行截图

在这里插入图片描述

Code

//
//  main.c
//  09-数组
//
//  Created by wuyujin1997 on 2023/1/28.
//#include 
void printArray1(int pArr[], int length);
void printArray2(int* pArr, int length);int main() {int array[] = {11, 22, 33, 44, 55};printf("==> main start\n");printf("sizeof(pArr) = %lu\n", sizeof(array));printf("sizeof(pArr[0]) = %lu\n", sizeof(array[0]));int length = sizeof(array) / sizeof(array[0]);printf("length = %d\n", length);for (int i = 0; i < length; i++) {printf("array[%d] = %d\t", i, array[i]);}printf("\n==> main end\n");printArray1(array, length);printArray2(array, length);return 0;
}void printArray1(int pArr[], int length) {printf("\n==> printArray1(int pArr[], int specificLength) start\n");for (int i = 0; i < length; i++) {printf("array[%d] = %d\t", i, pArr[i]);}printf("\n==> printArray1(int pArr[], int specificLength) end\n");
}void printArray2(int* pArr, int length) {printf("\n==> printArray2(int* pArr, int specificLength) start\n");for (int i = 0; i < length; i++) {printf("array[%d] = %d\t", i, pArr[i]);}printf("\n==> printArray2(int* pArr, int specificLength) end\n");
}
==> main start
sizeof(pArr) = 20
sizeof(pArr[0]) = 4
length = 5
array[0] = 11	array[1] = 22	array[2] = 33	array[3] = 44	array[4] = 55	
==> main end==> printArray1(int pArr[], int specificLength) start
array[0] = 11	array[1] = 22	array[2] = 33	array[3] = 44	array[4] = 55	
==> printArray1(int pArr[], int specificLength) end==> printArray2(int* pArr, int specificLength) start
array[0] = 11	array[1] = 22	array[2] = 33	array[3] = 44	array[4] = 55	
==> printArray2(int* pArr, int specificLength) end
Program ended with exit code: 0

关于数组长度在被调函数中的计算错误

运行截图 & 警告信息

Sizeof on array function parameter will return size of 'int *' instead of 'int[]'
'sizeof (pArr)' will return the size of the pointer, not the array itself

我们可以用 sizeof(数组名)sizeof(数组第一个元素) 两值相除得到数组的长度。
可以当把这个数组作为参数传到另一个方法的时候,在另一个方法中无法用同样的方法计算得出数组长度。
所以,必须在该函数的参数列表中同时传入数组的长度

下图中:在main方法中声明了数组,可以通过sizeof计算出数组长度:20字节。
可是当使用了两种方法传递数组到另一个被调函数之后,在被调函数内部可以发现sizeof拿不到数组的长度,而是单个指针变量的size。
Xcode的提示也很明确:'sizeof (pArr)' will return the size of the pointer, not the array itself,即sizeof(数组名)在此处返回的是指针变量的size,而非数组本身的size。
在这里插入图片描述
另外注意一下 Sizeof on array function parameter will return size of 'int *' instead of 'int[]' 会在什么时候出现:
方法参数中数组传递方式是int pArr[]而非int* pArr的时候,我们使用sizeof(pArr)才出现了这句警告。
在这里插入图片描述

Code

//
//  main.c
//  09-数组
//
//  Created by wuyujin1997 on 2023/1/28.
//#include 
void printArray1(int pArr[], int length);
void printArray2(int* pArr, int length);int main() {int array[] = {11, 22, 33, 44, 55};printf("==> main start\n");printf("sizeof(pArr) = %lu\n", sizeof(array));printf("sizeof(pArr[0]) = %lu\n", sizeof(array[0]));int length = sizeof(array) / sizeof(array[0]);printf("length = %d\n", length);for (int i = 0; i < length; i++) {printf("array[%d] = %d\t", i, array[i]);}printf("\n==> main end\n");printArray1(array, length);printArray2(array, length);return 0;
}void printArray1(int pArr[], int specificLength) {printf("\n==> printArray1(int pArr[], int specificLength) start\n");printf("sizeof(pArr) = %lu\n", sizeof(pArr));printf("sizeof(pArr[0]) = %lu\n", sizeof(pArr[0]));int length = sizeof(pArr) / sizeof(pArr[0]);printf("length = %d\n", length);for (int i = 0; i < length; i++) {printf("array[%d] = %d\t", i, pArr[i]);}printf("\n==> printArray1(int pArr[], int specificLength) end\n");
}void printArray2(int* pArr, int specificLength) {printf("\n==> printArray2(int* pArr, int specificLength) start\n");printf("sizeof(pArr) = %lu\n", sizeof(pArr));printf("sizeof(pArr[0]) = %lu\n", sizeof(pArr[0]));int length = sizeof(pArr) / sizeof(pArr[0]);printf("length = %d\n", length);for (int i = 0; i < length; i++) {printf("array[%d] = %d\t", i, pArr[i]);}printf("\n==> printArray2(int* pArr, int specificLength) end\n");
}

Output:

==> main start
sizeof(pArr) = 20
sizeof(pArr[0]) = 4
length = 5
array[0] = 11	array[1] = 22	array[2] = 33	array[3] = 44	array[4] = 55	
==> main end==> printArray1(int pArr[], int specificLength) start
sizeof(pArr) = 8
sizeof(pArr[0]) = 4
length = 2
array[0] = 11	array[1] = 22	
==> printArray1(int pArr[], int specificLength) end==> printArray2(int* pArr, int specificLength) start
sizeof(pArr) = 8
sizeof(pArr[0]) = 4
length = 2
array[0] = 11	array[1] = 22	
==> printArray2(int* pArr, int specificLength) end
Program ended with exit code: 0

数组变量是一类特殊的、指向自己的指针变量

证明过程见 https://blog.csdn.net/wuyujin1997/article/details/128783233?

相关内容

热门资讯

诚信作文450字 诚信作文450字(精选69篇)  在日常学习、工作或生活中,大家都经常接触到作文吧,借助作文可以宣泄...
挫折作文 关于挫折作文5篇  在日常的学习、工作、生活中,大家总免不了要接触或使用作文吧,借助作文可以宣泄心中...
清明节的作文500字 关于清明节的作文500字(精选36篇)  在日常学习、工作或生活中,大家都跟作文打过交道吧,借助作文...
夏天的作文 关于夏天的作文15篇  在日常学习、工作抑或是生活中,大家一定都接触过作文吧,借助作文可以宣泄心中的...
许下我们共同的诺言550字作... 许下我们共同的诺言550字作文  二十六个脚印,二十六个年轮,带来祝贺,带来喜悦,带来吉祥,带来安康...
清明节的作文100字 【实用】清明节的作文100字五篇  在平时的学习、工作或生活中,大家对作文都不陌生吧,作文根据写作时...
难忘的第一次洗碗400字优秀... 难忘的第一次洗碗400字优秀作文  每个人都有过难忘的第一次的经历,比如:第一次学骑自行车,第一次写...
以春节为话题的作文200字 关于以春节为话题的作文200字9篇  在现实生活或工作学习中,大家都经常看到作文的身影吧,借助作文可...
小学写事作文400字 小学写事作文400字汇总九篇  在平凡的学习、工作、生活中,大家都有写作文的经历,对作文很是熟悉吧,...
感动的作文300字 感动的作文300字6篇  在学习、工作、生活中,大家都经常接触到作文吧,借助作文可以宣泄心中的情感,...
假如我有一只神笔作文 假如我有一只神笔作文(精选31篇)  在学习、工作或生活中,大家都经常接触到作文吧,借助作文可以提高...
快乐的暑假生活作文 快乐的暑假生活作文三篇  在日常学习、工作抑或是生活中,大家都不可避免地会接触到作文吧,作文是一种言...
512国际护士节的由来 512国际护士节的由来  国际护士节是每年的5月12日,是为纪念现代护理学科的创始人弗洛伦斯·南丁格...
国庆节的作文300字 关于国庆节的作文300字5篇  在日复一日的学习、工作或生活中,大家都不可避免地会接触到作文吧,作文...
端午节的作文 端午节的作文500字(精选73篇)  在日常生活或是工作学习中,许多人都有过写作文的经历,对作文都不...
六一儿童节优秀作文300字 六一儿童节优秀作文300字(精选26篇)  在日常学习、工作抑或是生活中,大家都经常看到作文的身影吧...
妈妈的网购生活作文600字 妈妈的网购生活作文600字 (精选15篇)  在平日的学习、工作和生活里,大家或多或少都会接触过作文...
那一盏灯作文 关于那一盏灯作文(精选39篇)  在平时的学习、工作或生活中,许多人都有过写作文的经历,对作文都不陌...
春节趣事作文600字 【热门】春节趣事作文600字三篇  在平平淡淡的日常中,大家最不陌生的就是作文了吧,借助作文人们可以...
二年级看图写话植树节作文 二年级看图写话植树节作文  春天到了,小明和小花一起到山上去种树。接下来是小编为你带来收集整理的二年...