C/C++值传递和址传递有什么区别

技术C/C++值传递和址传递有什么区别这篇文章主要为大家展示了“C/C++值传递和址传递有什么区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C/C++值传递和址传递有什么

本文主要展示“C/C值传输和地址传输有什么区别”。内容简单易懂,条理清晰,希望能帮你解开疑惑。让边肖带领大家学习和研究《C/C值传递和地址传递有什么区别》一文。

信用证按价值交货与按地址交货明显不同。它们之间有一个区别:

按值传递:将原函数的值复制到过去被调用的函数中,被调用函数中值的修改不会影响原函数的值。

传递地址:调用函数时,复制过去原函数的值所在的地址,被调用函数对该地址所做的修改会影响原值。

概述:

首先,我们需要知道“A的地址”和“地址A中的内容”的区别。数据存储在内存中,每个变量都有一个内存地址,变量的内容存储在内存地址对应的空间中。

说定义。

inta=10那么a在内存中的地址是0x1100,在这个地址中存储的数据是10

C/C++值传递和址传递有什么区别

如果创建一个指针P,把A的地址赋给P,就会把A的第一个地址0x1100赋给指针P,此时P的值就是内存中变量A的第一个地址。

inta=10

int * p;

p=a;//将a的第一个地址分配给p C/C++值传递和址传递有什么区别

简单的理解就像去图书馆借书。每本书都会有它的编号(地址)来记录它的位置,而这本书就是这个地址对应的内容。

如果你使用指针,你会得到对应于图书的编号(地址),存储的内容就是地址。

如果给变量赋值并传递值,就相当于复制一次图书(地址对应的内容),然后用新的编号(地址)存储复制的图书。

C/C++值传递和址传递有什么区别

从命名理解。

所以我们会发现:

值转移,或变量赋值,修改变量的值,并在不影响原编号(地址)中数据的情况下,修改新编号(地址)中的内容(复制本)。

也就是说,形式参数是参数内容的副本,而不是地址的副本,所以改变形式参数的值不会影响参数的值。

C/C++值传递和址传递有什么区别

使用地址转移和指针来修改变量的值,意味着原编号(地址)中的账本被修改,新的账本相当于实际参数本身的操作。

声明:描述在其他地方创建的对象,不分配内存。(可以出现在很多地方)

定义:创建一个新对象并分配内存。(只能出现一次)

值传递

,创建了一个新的内存空间来存储原始变量的值,并且通过修改变量来修改新内存空间中的值。因此,函数不会修改原始参数。

值传递的优点:通过值传递的参数可以是数字、变量和表达式。原始参数的值不会被修改。

值传递的缺点:不能修改原始参数的值。

# includestdio.h

空隙交换(intx,inty)

{

inttemp

temp=x;

x=y;

y=温度;

//printf(‘x=%d,y=%d\n ‘,x,y);

}

intmain(void)

{

inta=4,b=6;

Printf(‘在exchange :之前\na=%d,b=%d\n ‘,

 a, b);
swap (a, b);
printf ("交换后:\n a = %d, b = %d\n", a, b);
return 0;
}

输出:

C/C++值传递和址传递有什么区别

址传递

址传递就是指针传递,形参实际是指向实参地址的指针,当对形参的进行操作时,就相当于对实参本身进行的操作,可以改变指针指向内容的值,但是不能改变指针本身的地址。

#include <stdio.h>
void swap (int *x, int *y)
{
	int temp=*x;
	*x=*y;
	*y=temp;
	//printf("x = %d, y = %d\n", *x, *y);
}
 
int main(void)
{
	int a=4;
	int b=6;
    printf("交换前:\n a = %d, b = %d\n", a, b);
	swap (&a,&b);  //传递的是地址 
	printf("交换后:\n a = %d, b = %d\n", a, b);
	return 0;
}

C/C++值传递和址传递有什么区别

在你了解了什么是值传递和址传递之后,我们来看一个面试题:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void GetMemory( char *p ) {
	p = (char *) malloc( 100 );
}
int main (void) {
	char *str = NULL;
	GetMemory( str );
	strcpy( str, "hello world" );
	printf( str );
	return 0;
}

请问运行会有什么样的结果? 会输出hello world吗?

答:程序崩溃,没有输出

因为 GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。strcpy(str, “hello world”);将使程序崩溃
函数中的p其实是实参str的一份拷贝,函数中的操作都是对q进行的,str仍然是NULL,所以输出*str的值产生崩溃

也就是:传递给形参的指针仍然是实参指针的一份拷贝

C/C++值传递和址传递有什么区别

这一点需要注意

解决的话可以把形参改为二重指针,程序便可以按预想中的情形进行:

二重指针指向一重指针的地址 也就是传递过来的实际是*str的参数本身

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void GetMemory( char **p ) {
	*p = (char *) malloc( 100 );
}
int main (void) {
	
	char *str = NULL;
	GetMemory(&str);
	strcpy( str, "hello world" );
	printf( str );
	return 0;
}

以上是“C/C++值传递和址传递有什么区别”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/51775.html

(0)

相关推荐

  • 对我影响最大的人,对我影响最大的人妈妈作文

    技术对我影响最大的人,对我影响最大的人妈妈作文她可以不知道我的名字对我影响最大的人,不知道我的性格,甚至不必认识我,不必了解我,就可以爱我爱得那样刻骨铭心。 是的,她就是我的妈妈。是她给了我第一份最纯洁最美丽的爱。

    生活 2021年10月27日
  • qq忘记账号怎么办,忘记自己QQ号了,怎办

    技术qq忘记账号怎么办,忘记自己QQ号了,怎办忘记QQ号码是多少确实是个难题。这并不像找回密码那样有官方渠道。所以要通过一些技巧来尝试找到这个忘记的号码qq忘记账号怎么办:
    分为如下几种情况可以尝试找到账号(注:该方法只

    生活 2021年10月24日
  • 抖音粉丝怎么涨,抖音如何涨粉?

    技术抖音粉丝怎么涨,抖音如何涨粉?不得不说,在抖音上一切皆有可能,甚至很多人莫名其妙就火了,自己也是猝不及防。随着越来越多的网红的出现,许多人都纷纷加入抖音行列,希望一夜爆红,但是又往往事与愿违,有没有好一点的涨粉套路,

    测评 2021年10月20日
  • 金银花别名,金银花另外一个名字叫什么

    技术金银花别名,金银花另外一个名字叫什么金银花学名叫忍冬,别名金银藤、银藤、子风藤、鸳鸯藤等金银花别名。 金银花 ,正名为忍冬。“金银花”一名出自《本草纲目》,由于忍冬花初开为白色,后转为黄色,因此得名金银花。是川续断目

    生活 2021年10月31日
  • JDBC中如何连接数据库

    技术JDBC中如何连接数据库这篇文章主要为大家展示了“JDBC中如何连接数据库”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JDBC中如何连接数据库”这篇文章吧。连接数据库的

    攻略 2021年11月25日
  • 怎么搭建Solr8与ikanalyzer

    技术怎么搭建Solr8与ikanalyzer今天就跟大家聊聊有关怎么搭建Solr8与ikanalyzer,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。服务安装并启

    攻略 2021年10月19日