疑问c++结构体(数组)指针作为函数参数,会不会修改实参的值?(代码片段)

ZSYL ZSYL     2023-02-12     615

关键词:

C++结构体指针作为函数参数,不会修改实参的值?

前言

最近学了C++的指针和结构体,记得函数传参时,形参传递指针,则可以修改实参的值。

可是今天看到一个关于结构体的数组作为形参传入函数中,却成功修改实参的值,感觉很是疑问?

实例

#include<iostream>
using namespace std;

//英雄结构体
struct hero

	string name;
	int age;
	string sex;
;

void changeArray(hero arr[])

	arr[0].name = "猪猪侠";


//打印数组
void printHeros(hero arr[], int len)

	for (int i = 0; i < len; i++)
	
		cout << "姓名: " << arr[i].name << " 性别: " << arr[i].sex << " 年龄: " << arr[i].age << endl;
	


int main() 

	struct hero arr[5] =
	
		"刘备",23,"男",
		"关羽",22,"男",
		"张飞",20,"男",
		"赵云",21,"男",
		"貂蝉",19,"女",
	;
	
	 //获取数组元素个数
	int len = sizeof(arr) / sizeof(hero);

	printHeros(arr, len); 
	
	changeArray(arr);
	
	cout << "=============" << endl;
	
	printHeros(arr, len);
	
	system("pause");

	return 0;

姓名: 刘备 性别: 男 年龄: 23
姓名: 关羽 性别: 男 年龄: 22
姓名: 张飞 性别: 男 年龄: 20
姓名: 赵云 性别: 男 年龄: 21
姓名: 貂蝉 性别: 女 年龄: 19
=============
姓名: 猪猪侠 性别: 男 年龄: 23
姓名: 关羽 性别: 男 年龄: 22
姓名: 张飞 性别: 男 年龄: 20
姓名: 赵云 性别: 男 年龄: 21
姓名: 貂蝉 性别: 女 年龄: 19

原因

在写C++的时候,当使用一个数组作为函数参数传入的时候,数组自动转化成指针变量。

#include<iostream>
using namespace std;

void printArr(int arr[])

	cout << *arr << endl;
	arr++; // 正确
	cout << *arr << endl;
	
	cout << arr[1] << endl;
	arr[1] = 0;
	cout << arr[1] << endl;
;

int main() 

	int arr[] = 1,2,3; // arr++; 这里错误
	
	printArr(arr);
	
	system("pause");

	return 0;


1
2
3
0

因此在函数内部修改形参数组时,实参也会发生改变。

又一

最近学了C++的指针和结构体,记得函数传参时,形参传递指针,则可以修改实参的值。

可是今天看到一个关于结构体作为指针传入函数中,却未成功修改实参的值,感觉很是疑问?

#include<iostream>
using namespace std;

//英雄结构体
struct hero

	string name;
	int age;
	string sex;
;

void printArr(int arr[])

	cout << *arr << endl;
	arr++; // 正确
	cout << *arr << endl;
	
	cout << arr[1] << endl;
	arr[1] = 0;
	cout << arr[1] << endl;
;

void show(hero p) 
	cout << "结构体形参传递:" << endl; 
	cout << p.name << endl;	
	p.name = "猪猪侠";
	cout << p.name << endl;	

void show2(hero * p) 
	cout << "结构体指针传递:" << endl; 
	cout << p->name << endl;	
	p->name = "猪猪侠";
	cout << p->name << endl;	


int main() 

	int arr[] = 1,2,3; // arr++; 这里错误
	
	printArr(arr);
	
	struct hero p = "刘备",23,"男";
	
	show(p);  // 刘备 
	cout << "结构体实参:" << endl; 
	cout << p.name << endl;	// 实参未变 
	
	// 报错 
	show2(&p);  // 刘备 
	cout << "结构体实参:" << endl; 
	cout << p.name << endl;	// 实参未变 
	
	system("pause");
	
	return 0;

1
2
3
0
结构体形参传递:
刘备
猪猪侠
结构体实参:
刘备
结构体指针传递:
刘备
猪猪侠
结构体实参:
猪猪侠

但是这篇文章C++中的结构体指针作为函数参数,不会修改实参的值的问题不是很理解!我的测试应该是可以修改实参的值啊。

有待研究!

参考Link


加油!

感谢!

努力!

c++基础3(函数指针结构体)(代码片段)

...针const修饰指针指针和数组指针和函数指针、数组、函数结构体结构体基本概念结构体定义和使用结构体数组结构体指针结构体嵌套结构体结构体做函数参数结构体中const使用场景结构体案例案例1案例2函数函数的定义函数的定义... 查看详情

结构体作为函数参数值传递的问题

参考技术A传结构体地址与传结构体指针二者都可以作为传出参数,因为接受函数必须为其定义一个结构指针来接收,这样在函数内就可以修改结构体,在这点上二者没有区别。定义结构体指针未分配地址空间就作为参数传递会... 查看详情

c语言结构体(结构体数组作为函数参数|数组在栈内存创建)(代码片段)

文章目录一、结构体数组作为函数参数(数组在栈内存创建)二、完整代码示例一、结构体数组作为函数参数(数组在栈内存创建)声明结构体类型:定义结构体数据类型,同时为该结构体类型声明别名,可以直接使用别名结构体变量名... 查看详情

c语言结构体(结构体作为函数参数|结构体指针作为函数参数)(代码片段)

文章目录一、结构体作为函数参数二、结构体指针作为函数参数三、完整代码示例一、结构体作为函数参数结构体变量作为函数形参,在函数中,只能访问该函数形参,无法修改结构体内存的值;结构体变量通过形参形式传入,会在该p... 查看详情

c++入门基础教程:c语言的指针与结构体到底怎么用?(代码片段)

...2.5.1指针数组2.5.2指向指针的指针2.6 指向函数的指针三、结构体3.1结构体的基础知识3.1.1结构体变量的定义3.1.2 结构体变量的初始化3.1.3访问结构体变量成员3.2结构体与函数3.3结构体数组3.4指 查看详情

结构体,结构体指针作为函数参数的应用笔记

1.结构体,结构体指针作为函数参数有何区别#include<stdio.h>#include<string.h>structanimal{charname[30];intnum;};//使用结构体作为参数浪费内存需要建立结构体voidchange_struct(structanimalcat){cat.num=17;}//函数内部改变需要地址所以需要指针... 查看详情

c语言关于结构体做参数传递?

...变了。学生一枚,求大神解释一下参考技术A双指针C语言结构体传参小-黯原创关注7点赞·2315人阅读目录C语言结构体传参1.普通传参1.1测试代码1.2测试结果1.3结果分析2.单指针传参2.1修改结构体数据2.1.1测试代码2.1.2测试结果... 查看详情

如何将不同类型的结构体作为一个函数的参数?

定义一个函数,需要将不同类型的结构体作为参数传递进去,请问怎样实现?这个参数定义为什么类型的呢?(可以用来接收不同的结构体)可以利用函数的重载。比如说定义了两个结构体A和B,函数func()为要接受不同参数的函数... 查看详情

c语言结构体的指针作为函数参数问题

例如我定义了一个嵌套的结构体。structpointintx,y;;structlinestructpointstart;structpointend;;那么我在定义一个函数求线段长度时如何利用指针来作为函数的参数?这个指针要怎么表示?line*就可以啊。如果想这个参数的内容不被修改,可... 查看详情

c++逆向分析——this指针

...下来我们就需要一一学习这些概念。封装之前我们学习过结构体这个概念,那么结构体可以做参数传递吗?我们来看一下如下代码:structStudentinta;intb;intc;intd;; intPlus(Students)returns.a+s.b+s.c+s.d; voidmain()Students=1,2,3,4;intres=Plus(s)... 查看详情

结构体数组怎么做函数参数

定义了一个结构体数组STUDENTstudent[200];如何用作函数参数如:voidLabel();函数里面要对数组的元素student[i].元素做操作怎么实现小白求高手详解括号中加入STUDENTgh[]首先要在主函数前定义voidLabel(STUDENT*[])但在STUDENT定义之后引用时L... 查看详情

c基础结构体(代码片段)

目录一、结构体struct的定义和.操作符的使用二、结构体的创建和初始化三、结构体的内存对齐模式3.1结构体强转其他类型四、指定结构体元素的位字段(bit)五、结构数组5.1结构体数组的冒泡排序六、结构体嵌套七、结构体的赋值... 查看详情

c++指针问题,请问如何定义一个返回值为结构体指针数组的函数?

也就是说函数返回值为指向结构体指针数组的指针#include<stdio.h>structs ;//ptarrpt是指向具有2个指针元素的数组的指针类型typedefstructs*(*ptarrpt)[2];ptarrptf1() staticstructs*ptarr[2]; return&ptarr;structs*(*f2())[2] staticstructs*ptarr[2]; return&ptarr;intm... 查看详情

qt怎样将一个结构体作为函数参数从c++传递到qml

参考技术A不太好传,除非是QT标准的数据结构,一开始我也纠结这个,后面直接传JSON对象就好了。结构体就算了把,QML不支持本回答被提问者采纳 查看详情

go语言基础函数,数组,指针,结构体(代码片段)

...指针的使用空指针指针数组将指针传入函数进行值的交换结构体自定义类型和类型别名结构体初始化匿名结构体结构体的内存布局结构体内存对齐各变量类型所占用空间结构体内存对齐构 查看详情

语法*第九章*5结构体指针作为函数参数(代码片段)

#include<stdio.h>structstudentintnum;charname[20];floatscore;stu=112301,"bowen1",20;voidprint(structstudent*p);intmain(void)print(&stu);voidprint(structstudent*p)printf("%d%s%0.1f",p- 查看详情

c语言结构指针变量作函数参数和链表基础

结构体变量作为函数参数(传递整个结构体):指向结构体变量的指针作为实参(传递结构体的地址):数据结构之链表:      查看详情

C++:数组作为函数形式参数让我出错

...使用C++编写代码,并且已经通过用户定义的函数、数组和结构。我们没有对 查看详情