c++ primer 函数传值1

不看c++ primer  永远不知道自己基础有多差

函数的參数传值一般有两种方式:值传递,引用传递。

值传递有以下两种形式:

void func( int a )
{
//
}

void func1( int *a )
{
//
}

对于 func 和func1都是通过拷贝内存来实现的

func1

int m = 10 ;
func1( int *a ) ;
//处理过程为: a = &m ;
//然后通过指针 *a 对 m进行间接操作

传引用

void func2( int &a )
{
//
}

引用就是变量的一个别名,不会发生内存的拷贝

典型的面试题:

void GetMemory1(char *p)
{
    p = (char *)malloc(100);
}

void Test1(void)
{
    char *str = NULL;
    GetMemory1(str);
    strcpy(str, "hello world");
    printf(str);
}
<p>
</p><pre name="code" class="cpp">// p = str;
// p = malloc(...);
//p和str有半毛线关系?
char *GetMemory2(void)
{
	char p[] = "hello world";
	return p;
}
void Test2(void)
{
	char *str = NULL;
	str = GetMemory2();
	printf(str);

}
char *GetMemory3(void)
{
	return
		"hello world";
}
void Test3(void)
{
	char *str = NULL;
	str = GetMemory3();
	printf(str);}
//Test3 中打印hello world,由于返回常量区,并且并没有被改动过。Test2中不一定能打印出hello world,由于指向的是栈。
void GetMemory4(char **p, int num)
{
	*p = (char *)malloc(num);

}
void Test4(void)
{
	char *str = NULL;
	GetMemory3(&str, 100);
	strcpy(str, "hello");
	printf(str);
}//内存没释放
void Test5(void)
{
	char *str = (char *) malloc(100);
	strcpy(str, "hello");
	free(str);
	if(str != NULL)
	{
		strcpy(str, "world");
		printf(str);
	}
}//str为野指针,打印的结果不得而知
void Test6()
{
	char *str=(char *)malloc(100);
	strcpy(str, "hello");
	str+=6;
	free(str);
	if(str!=NULL)
	{
		strcpy(str, "world"); printf(str);
	}
}//VC断言失败,执行错误
时间: 2024-10-22 02:39:28

c++ primer 函数传值1的相关文章

[java学习笔记]java语言基础概述之函数的定义和使用&amp;函数传值问题

1.函数 1.什么是函数? 定义在类中的具有特定功能的一段独立小程序. 函数也叫做方法 2.函数的格式 修饰符   返回值类型    函数名(参数类型  形式参数1, 参数类型  形式参数2-) {           执行语句(函数体);           return 返回值;       } 返回值类型:函数运行完成后输出的数据类型. 参数类型:是形式参数的数据类型. 形式参数:是一个变量,用于储存调用函数时传递给函数的实际参数. 实际参数:传递给形参的实际数据. return:结束函数

js:值类型/引用类型/内存回收/函数传值

把这4个概念放在一起写,因为它们是互通的 值类型:一个变量对应一块内存 var a=1; var b=a; a=2; 此时b还是等于1 就像你的克隆人,你心情不好去跳崖,他才不会傻乎乎地跟着你去跳 数值.boolean.null.undefined都是值类型 引用类型:有的博主这样比喻,一家店,它的引用就是它的钥匙 鉴于“作的精神”,我换一种比喻 一台电视机(内存)和它的遥控器关系(引用变量) 可以用遥控器换频道,但不可以用遥控器把电视变成冰箱 如果这电视不只一个遥控器,那么它们可以共同控制电视

jquery的ajax()函数传值中文乱码解决方法介绍

前台 jQuery.post("/MailTemplate/SaveMailTemplate?Code=" + item.Code + "&DisplayName=" +encodeURI   (item.DisplayName) + "&Body=" +encodeURI(item.Body), {}, function (data) {                                if (data == 'S

python-输入不定长参数函数传值

""" 不定长参数函数传值时,传入的值被设定为一个元组.但当不定长参数不是在程序中设定,而是运行程序过程中手动输入时,所有参数被设定为一个元组再以实参传入函数中,此时相当于不定长参数仅有该元组一个参数,而不是多个参数.例子如下: """ def multi(*p): sum = 1 for arrs in p: for arr in arrs: sum *= int(arr) print("乘积结果为:{}".format(s

JS——函数传值过长 防止字符串被数字化

2018-12-24  11:11:57 函数传值 长度过长 会被自动截取 解决方法: 1 '<div class="card" onclick="order(\''+order_ids+'\');">' 原文地址:https://www.cnblogs.com/jry199506/p/10167704.html

函数传值

` //Java语言在调用函数时,永远只能传值给函数" package 数组; import java.util.Scanner; public class ssssss { public static void swap(int a, int b){ int t; t = a; a = b; b = t; System.out.println("转换后a="+a+";b="+b); } public static void main(String[] a

python中函数传值与传引用

python中函数整数,字符串,元组都是传值,函数中不会改变其值,其他的会在函数中改变其值 例如传列表: #-*-ecoding:UTF-8 -*- def fun(a):     a[0]="sss";     print a     print id(a)     return ; a=["a","b"]; fun(a); print a; print id(a) 列表中的值已经改变,但列表的地址没有改变

go slice与函数传值的理解

go语言中所有的传值方式都是传值操作. 今天遇到了以下代码: func main(){ slice := make([]int ,1,1) fmt.Println(slice) change(s) fmt.Println(slice) } func change(s []int){ s = append(s,2) } 输出结果是: 0 0 当时感到有些疑惑,学c或c++时,传入的参数为指针(数组首地址)时,change内这种直接修改参数s方法时可以修改值的,那么为何在go中无效呢? 1.go语言

关于swap函数传值的问题

#include <stdio.h> void swap(int * p3,int * p4); int main() {  int a = 9;  int b = 8;  int * p1 = &a;  int * p2 = &b;    printf("%x %x\n",p1,p2);  swap(p1,p2);    printf("%d %d\n",a,b);  printf("%d %d\n",*p1,*p2