IOS开发 函数传入指针,与函数传入引用的区别
sqlite3_open([oldPath2UTF8String],&oldDatabase);如上行代码,请问下大家,函数在传入指针,与传入&oldDatabase到底...
sqlite3_open([oldPath2 UTF8String], &oldDatabase);
如上行代码 , 请问下大家,函数在传入指针,与传入&oldDatabase到底有什么区别啊?? 展开
如上行代码 , 请问下大家,函数在传入指针,与传入&oldDatabase到底有什么区别啊?? 展开
展开全部
相关概念
c++三种传递参数方式
传参数的值(称值传递,简称传值),传参数的地址(称地址传递,简称为传址),和引用传递(称为传引用),相应的函数传值调用,传址调用和传引用调用
形参、实参
函数定义时参数表中的参数称为形式参数,简称形参;函数调用时参数表中的参数称为实际参数,简称实参。实参和形参之间的数据传递称为形实结合
说明
通常情况下,C++是传值调用,它是单向的,只能从实参到形参。形参实质上市实参的一种拷贝,所以传递时不会改变外部实参的值
引用的含义及功能
即别名,功能主要是传递函数的参数和返回值
引用的规则
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
实例
#include <iostream>
using namespace std ;
void Swap(int x, int y) ;
int main(void)
{
int a = 1 ;
int b = 2 ;
cout << "a = " << a << ", " << "b = " << b << endl ;
Swap(a, b) ;
cout << "a = " << a << ", " << "b = " << b << endl ;
system("pause") ;
return 0 ;
}
一:值传递
void Swap(int x, int y)
{
int temp = x ;
x = y ;
y = temp ;
}
输出结果:
a = 1, b = 2
a = 1, b = 2
原因:Swap(int x, int y)函数采用值传递的方式,传入的实参实际上是a和b的副本而非其本身,所以对副本的改变并不会反应到a和b本身上。
二:引用传递
void Swap(int &x, int &y)
{
int temp = x ;
x = y ;
y = temp ;
}
输出结果:
a = 1, b = 2
a = 2, b = 1
原因:Swap(int x, int y)函数采用引用传递的方式,传入的实参实际上是a和b的引用,对引用的改变会直接反应到a和b本身上。
三:指针传递
1. 改变指针本身
void Swap(int *x, int *y)
{
int *temp = x ;
x = y ;
y = temp ;
}
调用方法:Swap(&a, &b) ;
输出结果:
a = 1, b = 2
a = 1, b = 2
原因:Swap(int x, int y)函数采用指针传递的方式,传入的实参实际上是a和b的指针的副本,而且改变的是副本本身而非其间接引用,所以不会影响的指针所指向的值,即a和b本身上。
c++三种传递参数方式
传参数的值(称值传递,简称传值),传参数的地址(称地址传递,简称为传址),和引用传递(称为传引用),相应的函数传值调用,传址调用和传引用调用
形参、实参
函数定义时参数表中的参数称为形式参数,简称形参;函数调用时参数表中的参数称为实际参数,简称实参。实参和形参之间的数据传递称为形实结合
说明
通常情况下,C++是传值调用,它是单向的,只能从实参到形参。形参实质上市实参的一种拷贝,所以传递时不会改变外部实参的值
引用的含义及功能
即别名,功能主要是传递函数的参数和返回值
引用的规则
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
实例
#include <iostream>
using namespace std ;
void Swap(int x, int y) ;
int main(void)
{
int a = 1 ;
int b = 2 ;
cout << "a = " << a << ", " << "b = " << b << endl ;
Swap(a, b) ;
cout << "a = " << a << ", " << "b = " << b << endl ;
system("pause") ;
return 0 ;
}
一:值传递
void Swap(int x, int y)
{
int temp = x ;
x = y ;
y = temp ;
}
输出结果:
a = 1, b = 2
a = 1, b = 2
原因:Swap(int x, int y)函数采用值传递的方式,传入的实参实际上是a和b的副本而非其本身,所以对副本的改变并不会反应到a和b本身上。
二:引用传递
void Swap(int &x, int &y)
{
int temp = x ;
x = y ;
y = temp ;
}
输出结果:
a = 1, b = 2
a = 2, b = 1
原因:Swap(int x, int y)函数采用引用传递的方式,传入的实参实际上是a和b的引用,对引用的改变会直接反应到a和b本身上。
三:指针传递
1. 改变指针本身
void Swap(int *x, int *y)
{
int *temp = x ;
x = y ;
y = temp ;
}
调用方法:Swap(&a, &b) ;
输出结果:
a = 1, b = 2
a = 1, b = 2
原因:Swap(int x, int y)函数采用指针传递的方式,传入的实参实际上是a和b的指针的副本,而且改变的是副本本身而非其间接引用,所以不会影响的指针所指向的值,即a和b本身上。
2015-06-19 · 知道合伙人教育行家
关注
展开全部
定义结构体指针
//首先定义一个结构体
struct point {
int x;
int y;
};
//重命名该结构体类型,typedef可以重命名类型,这里将struct point类型重命名成sp了
typedef struct point sp;
//定义一个sp类型的变量a,即a为结构体类型,并且为a赋值
sp a={10,20};
//输出a的两个值
printf("a.x=%d,a.y=%d",a.x,a.y);
//创建指向a的结构体指针
sp *p=&a;
//两种方式输出a的值。p->x相当于(*p).x也相当于a.x
printf("\np->x=%d,p->y=%d",p->x,p->y);
printf("\n(*p).x=%d,(*p).y=%d",(*p).x,(*p).y);
//首先定义一个结构体
struct point {
int x;
int y;
};
//重命名该结构体类型,typedef可以重命名类型,这里将struct point类型重命名成sp了
typedef struct point sp;
//定义一个sp类型的变量a,即a为结构体类型,并且为a赋值
sp a={10,20};
//输出a的两个值
printf("a.x=%d,a.y=%d",a.x,a.y);
//创建指向a的结构体指针
sp *p=&a;
//两种方式输出a的值。p->x相当于(*p).x也相当于a.x
printf("\np->x=%d,p->y=%d",p->x,p->y);
printf("\n(*p).x=%d,(*p).y=%d",(*p).x,(*p).y);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
oldDatabase是一个数据库的首地址,&oldDatabase是一个指向某个数据库的指针的首地址,此时,数据库存在不存在还不一定怎么能把它的首地址传进去呢?所以要传入一个指针的首地址,你的函数操作的是一个指针而不是指针所指向的东西,还有很多其他的事例,比如:
NSError *error; ---->此时,error未指向任何东西。
void someMethod(para1,&error)
{
//do something ...
} --------》经过这个函数的处理,假如有error,error就指向这个error,假如一切安好,则error依然是nil。。。。
NSError *error; ---->此时,error未指向任何东西。
void someMethod(para1,&error)
{
//do something ...
} --------》经过这个函数的处理,假如有error,error就指向这个error,假如一切安好,则error依然是nil。。。。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指针里面存储的内存地址是可以改变的,但是引用对应的存储空间里的内存地址一经赋值就不能改变
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
&oldDatabase 这就是指针
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询