首页 > 其他分享 >【☀️C语言函数传参の结构体数组篇☀️】

【☀️C语言函数传参の结构体数组篇☀️】

时间:2023-02-06 15:03:07浏览次数:48  
标签:传参 idx int C语言 ptNum atNum 数组 printf idx1


背景介绍

C语言中函数参数传递的两种方式(“引用传递做函数参数”是C++的特性,C语言不支持。
(1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。
(2)传址,就是传变量的地址赋给函数里形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值。一般有变量地址作为参数、数组名作为参数、指针作为参数。

  1. 数组名作为参数时,传递的是数组的首地址,实参数组和形参数组共用了一段内存空间。所以当用数组名做参数时,实参和形参共享了一个数组,形参数组的改变也就是实参数组的改变。
  2. 指针作为参数和数组名作参数类似,传递的也是结构体数组的首地址,但是此时不是共享一个数组,而是共享一个变量的地址,也就是实参指针和形参指针共同指向同一个变量,共享同一个变量地址。

示例demo

下面的demo中:
test函数以结构体数组名为形参;
test1函数以结构体数组的首地址和数组大小作为形参;
test2函数是把结构体数组的首地址传入,然后以数组的形式遍历;

#include <stdio.h>
#include <string.h>

#define MAXNUM (2)

typedef struct tagNumber
{
int i;
int j;
int k;
}TNum;

typedef struct tagNumbers
{
TNum atNum[MAXNUM];
}TNums;


// 结构体数组名
void test (TNums atNums1[])
{
printf("atNums1 ptr:%p\r\n",atNums1);

int idx = 0;
int idx1 = 0;

for(idx = 0; idx < MAXNUM; idx++)
{
for(idx1 = 0; idx1 < MAXNUM; idx1++)
{
printf("i:%d\n",atNums1[idx].atNum[idx1].i);
printf("j:%d\n",atNums1[idx].atNum[idx1].j);
printf("k:%d\n",atNums1[idx].atNum[idx1].k);
}
}
}

//结构体指针1.0
void test1(TNums *ptNum,int num)
{
printf("ptNum ptr:%p\r\n",ptNum);
int idx = 0;
int idx1 = 0;

for(idx = 0; idx < num; idx++)
{
for(idx1 = 0; idx1 < num; idx1++)
{
printf("i:%d\n",(ptNum + idx)->atNum[idx1].i);
printf("j:%d\n",(ptNum + idx)->atNum[idx1].j);
printf("k:%d\n",(ptNum + idx)->atNum[idx1].k);
}
}
}

//结构体指针1.1
void test2(TNums *ptNum)
{
printf("ptNum ptr:%p\r\n",ptNum);
int idx = 0;
int idx1 = 0;

for(idx = 0; idx < MAXNUM; idx++)
{
for(idx1 = 0; idx1 < MAXNUM; idx1++)
{
printf("i:%d\n",ptNum[idx].atNum[idx1].i);
printf("j:%d\n",ptNum[idx].atNum[idx1].j);
printf("k:%d\n",ptNum[idx].atNum[idx1].k);
}
}
}

int main() {

TNums atNums[MAXNUM];
memset(atNums, 0, sizeof(atNums));

int idx = 0;
int idx1 = 0;
for(idx = 0; idx < MAXNUM; idx++)
{
for(idx1 = 0; idx1 < MAXNUM; idx1++)
{
atNums[idx].atNum[idx1].i = 1+idx;
atNums[idx].atNum[idx1].j = 2+idx;
atNums[idx].atNum[idx1].k = 3+idx;
}
}

printf("atNums ptr:%p\r\n",atNums);

printf("func 1:\r\n");
test(atNums);

printf("func 2:\r\n");
test1(atNums, MAXNUM);


printf("func 3:\r\n");
test2(atNums);
return 0;
}

打印信息:

atNums ptr:0x7fff87dba270
func 1:
atNums1 ptr:0x7fff87dba270
i:1
j:2
k:3
i:1
j:2
k:3
i:2
j:3
k:4
i:2
j:3
k:4
func 2:
ptNum ptr:0x7fff87dba270
i:1
j:2
k:3
i:1
j:2
k:3
i:2
j:3
k:4
i:2
j:3
k:4
func 3:
ptNum ptr:0x7fff87dba270
i:1
j:2
k:3
i:1
j:2
k:3
i:2
j:3
k:4
i:2
j:3
k:4

引经据典

​http://www.oh100.com/kaoshi/c/536660.html​


标签:传参,idx,int,C语言,ptNum,atNum,数组,printf,idx1
From: https://blog.51cto.com/u_15953444/6039151

相关文章

  • 《剑指Offer》-4-二维数组中查找/力扣-240-搜索二维数组Ⅱ
    从最后一列的第一个数字开始比较,依次倒数第二列第一个数字、倒数第三列...找到第一个<=target的数字,这样可以将范围缩小到一列然后用二分查找快速判断目标元素有没有......
  • 数组封装新方法
    //查找数组中符合条件的元素Array.prototype.where=function(condition){varret=[];for(vari=0;i<this.length;i++){if(condition(this[i])){ret.......
  • 《剑指Offer》-53-在排序数组中查找数字/力扣-34
    Ⅰ统计一个数字在排序数组中出现的次数 intsearch(vector<int>&nums,inttarget){ intcount=0; for(intnum:nums){ if(num==target)count++; ......
  • php去除数组中为0的元素的实例分析
    利用array_diff()函数来去除数组中为0的元素。该函数用于比较两个数组的值并返回差集,只需要使用一个包含“0”数组和原数组进行比较即可。语法格式“array_diff($arr,[0]......
  • 数组的定义
    publicclassDemo01{//数组是相同类型数据的有序集合//数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成//每一个数据称作一个数组元素,每......
  • 数组的声明创建
    publicclassDemo02{publicstaticvoidmain(String[]args){//数组是相同数据类型(数据类型可以为任何类型)的有序集合//数组也是对象。数组元素......
  • 反转数组
    publicclassDemo04{publicstaticvoidmain(String[]args){int[]arrays={1,2,3,4,5};print(reverse(arrays));}//反转数组public......
  • 找出数组中的数的最大值
    publicclassDemo03{publicstaticvoidmain(String[]args){int[]arrays={1,2,3,4,5,6};for(inti=0;i<arrays.length;i++){......
  • 多维数组
    publicclassDemo05{//多维数组publicstaticvoidmain(String[]args){int[][]arrays={{1,2},{3,4},{5,6},{7,8},{9,10}};//定义数组方法一......
  • 稀疏数组
    importjava.util.Arrays;publicclassDemo08{publicstaticvoidmain(String[]args){//1.创建一个二维数组11*110:没有棋子1:黑棋2:白棋......