c语⾔中结构体的值传递和地址传递的区别
通俗的来说,值传递只是把变量的值当做参数传递进⼦函数中,⽆论函数体中如何改变参数值,主函数的变量值都不会改变。
⽽地址传递,是把变量的地址传⼊⼦函数中,⼦函数中对于参数的改变,是通过传⼊的地址参数去内存中修改该变量存储的值,所以主函数中的变量值也会同步改变。
下⾯来演⽰⼀下c语⾔中如何改变结构体中的变量值:
#include<stdio.h>
#include<stdlib.h>
typedef struct Table{
int* head;
int length;
int size;
}table;
//初始化
void initTable(table *t,int size){
(*t).head=(int*)malloc(size*sizeof(int));
if(!(*t).head)
{
printf("初始化分配失败");
return;
}
(*t).length=0;
(*t).size=size;
}c语言和c++区别
//地址传递
void addByAddress(table *t,int newElement,int index){
int i =0;
if(index<1|| index>(*t).length+1){
printf("插⼊位置 %d 不对!,现有数据总数为 %d \n",index,(*t).length);
return;
}
if((*t).length>=(*t).size){
(*t).head =(int*)realloc((*t).head,((*t).size+1)*sizeof(int));
if(!(*t).head){
printf("存储分配失败");
return;
}
(*t).size +=1;
}
//如果插⼊位置⼩于等于length,则需要把元素后移
for(i =(*t).length-1;i>=index-1;i--){
(*t).head[i+1]=(*t).head[i];
}
(*t).head[index-1]= newElement;
//不能使⽤(*t).head[i] = newElement;
(*t).length++;
}
//值传递
void addByValue(table t,int newElement,int index)
{
if(index >t.length+1||index <1){
printf("插⼊位置 %d 不对!,现有数据总数为 %d \n",index,t.length);
return;
}
if(t.length>=t.size){
t.head=(int*)realloc(t.head,(t.size+1)*sizeof(int));
if(!t.head){
printf("存储分配失败");
return;
}
t.size +=1;
}
for(int i=t.length-1; i>=index-1; i--){
for(int i=t.length-1; i>=index-1; i--){
t.head[i+1]=t.head[i];
}
t.head[index-1]= newElement;
t.length++;
}
//打印结构体数组中的元素
void display(table t){
if(t.length ==0)
printf("数组为空!");
for(int i=0;i<t.length;i++){
printf("%d ",t.head[i]);
}
printf("\n");
}
/
/主函数
int main(){
table t,t1;
initTable(&t,10);
initTable(&t1,10);
int i=0;
//增加元素
printf("地址传递:\n");
//传递地址
for(i =0;i<10;i++){
addByAddress(&t,i+1,i+1);
}
display(t);
//传递值
printf("\n值传递:\n");
for(i =0;i<10;i++){
addByValue(t1,i+1,i+1);
}
display(t1);
return0;
}
测试结果:
该结果表明,值传递中,⼦函数中⽆法改变主函数中变量的值,结果中,因为第⼀个位置没有数据,所以从下标2开始插⼊数据,就显⽰插⼊位置不对,最后打印结果也显⽰数组为空,即表⽰通过值传递⽆法向结构体中的数组增加数据。所以需要使⽤地址传递,将结构体的地址传递进去,就可以改变其数组的值了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论