精华内容
下载资源
问答
  • typedef struct student{ ...请问:如何往每个结构体变量数据成员stud_number前面插入数字2016? 如:往jourdon学号01前插入2016,jourdon.insert(jourdon.stud_number.begin(),2016); 请问应该怎么写?
  • 而地址传递,是把变量的地址传入子函数中,子函数中对于参数的改变,是通过传入的地址参数去内存中修改该变量存储的值,所以主函数中的变量值也会同步改变。 下面来演示一下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;
        }
        //地址传递
        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--) {
                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);			 
    		return 0;
    	}
    

    测试结果:
    在这里插入图片描述
    该结果表明,值传递中,子函数中无法改变主函数中变量的值,结果中,因为第一个位置没有数据,所以从下标2开始插入数据,就显示插入位置不对,最后打印结果也显示数组为空,即表示通过值传递无法向结构体中的数组增加数据。所以需要使用地址传递,将结构体的地址传递进去,就可以改变其数组的值了。

    展开全文
  • 我们在看代码的时候,会注意到,如果函数的参数需要结构体的时候,一般是传递结构体指针,而不是传递结构体,这一点在Windows API中几乎都是如此,凡是用到结构体的地方,都是用它的指针来做参数的,这是什么原因呢...

    1. 我们在看代码的时候,会注意到,如果函数的参数需要结构体的时候,一般是传递结构体指针,而不是传递结构体,这一点在Windows API中几乎都是如此,凡是用到结构体的地方,都是用它的指针来做参数的,这是什么原因呢?最近发现,如果直接传结构体,编译器会把结构体的各个成员都一一压栈,而如果传递的是结构体指针的话,则只压一个结构体的指针就可以了,大为简洁

     

    2. 有这样一个函数

    问,在这个函数执行完,返回之后,p的值会被改变吗?

    答案是否,因为我们传递指针的目的是为了修改指针指向的地址的值,而不是指针的值,

    那么,如果想在函数里修改指针的值该怎么做?对了,只要把指向指针的指针传进来就可以了

    如下

    展开全文
  • 那这时要修改结构体对象stu 的成员应该怎么办呢,就可以运用**指针**来“解除”结构体的**私有封装**, 这里有个前提,那就是要知道你的对象是什么,如上面的**整数型 age,字符型ssex,双精度浮点型double**等等

    指针解封装,你必须知道的“初级简单解法”

    c语言之所以被认为强大,以及其自由性,很大部分体现在其灵活的指针运用上。
    所以这里就跟大家分享一下指针的强大之处,
    通过它来修改私对象成员值,不管是类的、结构体的还是大部分其他的

    我们都知道当一个类或结构体的成员是公有的时候,我们可以通过对象调用修改其成员值
    以结构体为例,如下:

    #include<iostream>
    using namespace std;
    
    //定义结构体
    struct Student{
    	int age;  //年龄
    	char ssex;  //性别
    	double score;  //得分
    };
    
    int main()
    {
    	Student stu; //创建对象
    	stu.age = 18;  //对象调用赋值
    	stu.ssex = 'F'; //对象调用赋值
    	stu.score = 90.00; //对象调用赋值
    	while (1);
    }
    

    而当结构体成员属性为私有private的时候,我们就没办法运用上面方法
    那要修改结构体Student的对象成员值应该怎么办呢,这时就可以运用指针来“解除”结构体的私有封装

    这里有个前提,那就是要知道你的对象是什么,如上面的整数型 age,字符型ssex,双精度浮点型double等等,如下,把结构体Student的age,ssex,double成员对象变为私有,在主函数main中通过定义指针变量p来修改(详细过程请看下面代码),这里顺便在结构体中定义了一个公有成员函数来显示结构体age,ssex,double私有成员的值

    代码如下:

    #include<iostream>
    #include<Windows.h>
    using namespace std;
    
    struct Student{
    private:
    	int age;  //年龄
    	char ssex;  //性别
    	double score;  //分数
    public:
    	void show()  //定义公有成员函数,显示私有成员函数值
    	{
    		cout << endl;
    		cout << "----修改值验证----";
    		cout << endl << endl;
    		cout << "年龄:" << age << ' ';
    		cout << "性别:" << ssex << ' ' << "成绩:";
    		printf("%.2lf", score);
    		/*附:cout跟printf是不同的,cout输出float或double,
    		是会将小数点后非有效数字的0去掉的,而printf里面以%f输出规定是以6位小数输出,
    		不管是不是有效数字,这里用printf是为表面double类型的score确实被修改了*/
    	}
    	
    };
    
    int main()
    {
    	SetConsoleTitle("修改私有成员值");  //修改窗口名,头文件Windows.h
    	Student stu;
    	int *p;
    	p = (int*)&stu;  //p指向stu.age内存首地址  (int*)为强制类型转换
    	*p = 20; //修改stu.age值
    	
    	p++;  //p地址偏移,指向stu.ssex  
    	*(char*)p = 'F';  //修改stu.ssex值
    
    	p++;  //p地址继续偏移,指向stu.score
    	*(double*)p = 99.00;  //修改stu.score值
    
    	stu.show(); //调用公有成员函数验证私有成员age,ssex,score值确实被修改了
    	while (1);
    }
    

    修改过程一般需要用到强制转换,因为结构体的成员对象与指针变量p类型不同==

    修改后的结果:
    在这里插入图片描述
    对待类的私有成员方法相同是一样的,只是在这里用结构体比较好让大家理解与吸收,理解后可以自己用类试试嘿嘿
    另外得提一点,就是不同类型变量占不同的大小内存块,如int占四个字节内存块,double占八个字节内存块,在结构体或类中用p指向变量首地址后,用p++偏移内存,
    但在结构体或类外,相同栈内存及变量类型相同才能偏移,且指针的偏移运算不同

    如int类型偏移为 p-=3即右移3*sizeof(int)个内存,double 好像为p-=6,其他的具体的可以查阅相关资料
    这里以相同类型的整型给大家示例下:

    #include<iostream>
    using namespace std;
    
    int main()
    {
    	
    
    	int n = 50;
    	int m = 60;
    	int*p = &n;
    	p-=3;
    	*p = 600;
    	cout << "n:" << n << " " << "m:" << m;
    	while (1);
    }
    
    

    运行结果为:
    在这里插入图片描述
    111有没有觉得很神奇,赶快亲自动手感受一下吧!

    展开全文
  • 如果冲结构创建一个对象并将对象赋给某个变量 则变量包含结构该变量放入结构的全部值,如果复制包含变量的结构,则将该复制所有的值,对新副本所作的任何修改都不会改变就副本的值(值类型的复制,自复制给其他的值...
  • 问题背景:在一次操作系统模拟实验中,我构造了一个PCB结构体,它包括几个变量:名称(字符串)、到达时间(整形)。。。 typedef struct pcb { char pname[N]; //进程名 char state; //状态(就绪R,等待W,...
  • Linux用GDB调试结构体的

    千次阅读 2013-02-19 19:16:44
    [个人原创]Linux用GDB调试时如何打印数组,结构体的打印及其修改或加入变量调试。  WEB2.0 » Unix&Linux技术 root 2011-9-1 12:58 评论(0) 阅读(3372) 大 | 中 | 小  WEB2.0 » Unix&...
  • 计算结构体的大小

    2014-08-28 20:41:44
    一什么是字节对齐为什么要对齐二编译器是按照什么样原则进行对齐如何修改编译器默认对齐 结构体成员可以是不同数据类型,成员按照定义时顺序依次存储在连续内存空间。和数组不一样是,...
  • 函数返回结构体的内幕

    万次阅读 2014-11-23 13:08:01
    函数返回结构体的内幕 在刚接触C语言编程时,无论是前辈还是教科书,都反复告诫我们两件事: ①函数的参数是传递(意味着在函数中对参数本身的修改无法“传回”); ②不要返回函数体内局部变量的地址,因为...
  • 如题,这个代码是一个结构体的一部分, 外面调用accumulate_forward函数时每次会传入一个,本来是取最大(注释掉的那句),现在想修改,想要该函数实现排序功能,然后返回中值,应该怎么写。编程很差,尤其是对...
  • 在刚接触C语言编程时,无论是前辈还是教科书,都反复告诫我们两件事: ...我们知道函数参数的值传递,就是将参数入栈(因此参数有自己的一份拷贝,函数中对参数的操作其实操作的就是这份拷贝)。而函数结.
  • 问 如果建立了结构体向量,如何... 利用迭代器,根据ID的值找到迭代器的位置,然后利用迭代器索引修改数值。 C++实例代码下载地址: 查找结构体向量变量(Vectors, structs and find)#include #include <algorith
  • UE4蓝图:创建和使用结构体

    千次阅读 2018-03-18 13:43:48
    如果我们想在蓝图中创建一个类,或者一个对象来作为一个整体,保存一些,一系列的属性,而只是单纯的修改和获取它的值,那么这就是结构体Struct. 那么在蓝图中怎么去创建一个结构体类型呢?当我们创建一个变量后,可以在...
  • 假设pointt是一个结构体,下面需要用函数对这个结构体进行自身的值修改。 则有 function pointt=change1(pointt) %对point这个结构体进行自身坐标变换pointt.r=21;
  • 文章目录1. 成员函数2. 构造函数2.1 如何定义2.2 如何使用2.3 还有一种写法2.4 示例:创建链表节点3. 与类区别 1. 成员函数 ... // 下面定义成员函数,修改成员数据 void set(string name, int year)...
  • 这里有一个内存分配相关的事实:结构体会被分配一块连续的内存,结构体的地址也代表了第一个成员的地址。 我们来看一个例子: package main import ( "fmt" "unsafe" ) type Programmer struct { nam...
  • 在mtk平台上,将是否需要自动attach的变量保存在NVRAM_EF_RAC_PREFERENCE_LID的arg1中。...如果要使手机开机自动attach到网络,可以修改COMMON_NVRAM_EF_RAC_PREFERENCE_DEFAULT的值,将该结构体里面的
  • printf("请输入插入元素的值:"); printf("请输入 学号: "); scanf_s("%s", &value.no,20); printf("姓名:"); scanf_s("%s", &value.name,8); printf("电话号码:"); scanf_s("%s", &...
  • 翻译:老码团队翻译组-Arya校对:老码团队翻译组-Jame ...类型(Value Types):每个实例都保留了一分独有数据拷贝,一般以结构体(struct)、枚举(enum)或者元组(tuple)形式出现。 引用类型(R...
  • 对于go语言中interface接口的理解,有一个疑问:既然接口只保存了函数,那么他到底有没有操作实际对象呢?如果操作的话,是怎么...本身结构体中除了method以外,还有别的字段,那么就可以通过method修改字段的值,...
  • Matlab的函数中如何实现按引用传递参数?...修改参数的值”,尤其在当传入参数是一个类或结构体时。 几经摸索,总算被俺发现了一种可以替代的方法,就是让函数的参数同时作为同名返回值(实际上不一定非得同名,...
  • 可以在保存wifi profile时,写NVRAM之前给结构体的homepage变量赋一个,这样就会把这个主页写进NVRAM里了。  1. srv_dtcnt_result_enum srv_dtcnt_db_store_add_wlan_prof(srv_dtcnt_prof_wlan_struct *data, ...

空空如也

空空如也

1 2 3 4 5
收藏数 91
精华内容 36
关键字:

如何修改结构体的值