C++指针做函数形参的问题(p=0),什么意思?

带码如下
void reset (int *ip)
{*ip=0 //改变指针所指对像的值
ip=0;//只改变了局部拷贝,实参未被改变
}
调用reset
int i=42;
reset(&i);
cout<<" *i= "<<i<<endl;

C++primer 第五版 page 188
上面为书上原话及代码 输出结果能看懂,但就是想问一下函数定义部分的ip=0啥作用????

这里设置ip = 0; 只是教学需要,在本函数中,实际没有作用。
这里只是说明形参ip改变了并没有改变实参 &i (即i的地址)值。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-06-15
更改地址
(指针的)追问

书上写了一句注解,只改变了ip的局部拷贝,但是实参并没有改变。
没读懂什么意思,求指点。或者说,上面的函数定义一句,ip=0,去掉有影响吗?

追答

运行结果没有影响

第2个回答  2019-02-27
对指针变量的定义包括三个内容:
(1)指针类型说明,即定义变量为一个指针变量;
(2)指针变量名;
(3)变量值(指针)所指向的变量的数据类型。
其一般形式为:
类型说明符
*变量名;
其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
例如:
int
*p1;
表示p1是一个指针变量,它的值是某个整型变量的地址。或者说p1指向一个整型变量。至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。
再如:
int
*p2;/*p2是指向整型变量的指针变量*/
float
*p3;/*p3是指向浮点变量的指针变量*/
char
*p4;/*p4是指向字符变量的指针变量*/
应该注意的是,一个指针变量只能指向同类型的变量,如
p3
只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,
决不能赋予任何其它数据,否则将引起错误。在c语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。
&变量名;
如&a表示变量a的地址,&b表示变量b的地址。变量本身必须预先说明。
设有指向整型变量的指针变量p,如要把整型变量a
的地址赋予p可以有以下两种方式:
(1)指针变量初始化的方法
int
a;
int
*p=&a;
(2)赋值语句的方法
int
a;
int
*p;
p=&a;
不允许把一个数赋予指针变量,故下面的赋值是错误的:
int
*p;
p=1000;
被赋值的指针变量前不能再加“*”说明符,如写为*p=&a
也是错误的。
假设:
int
i=200,
x;
int
*ip;
我们定义了两个整型变量i,x,还定义了一个指向整型数的指针变量ip。i,x中可存放整数,而ip中只能存放整型变量的地址。我们可以把i的地址赋给ip:
ip=&i;
此时指针变量ip指向整型变量i,假设变量i的地址为1800,这个赋值可形象理解为下图所示的联系。
以后我们便可以通过指针变量ip间接访问变量i,例如:
x=*ip;
运算符*访问以ip为地址的存贮区域,而ip中存放的是变量i的地址,因此,*ip访问的是地址为1800的存贮区域(因为是整数,实际上是从1800开始的两个字节),它就是i所占用的存贮区域,
所以上面的赋值表达式等价于
x=i;
第3个回答  2019-02-20
对指针变量的定义包括三个内容:
(1)指针类型说明,即定义变量为一个指针变量;
(2)指针变量名;
(3)变量值(指针)所指向的变量的数据类型。
其一般形式为:
类型说明符
*变量名;
其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
例如:
int
*p1;
表示p1是一个指针变量,它的值是某个整型变量的地址。或者说p1指向一个整型变量。至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。
再如:
int
*p2;/*p2是指向整型变量的指针变量*/
float
*p3;/*p3是指向浮点变量的指针变量*/
char
*p4;/*p4是指向字符变量的指针变量*/
应该注意的是,一个指针变量只能指向同类型的变量,如
p3
只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,
决不能赋予任何其它数据,否则将引起错误。在c语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。
&变量名;
如&a表示变量a的地址,&b表示变量b的地址。变量本身必须预先说明。
设有指向整型变量的指针变量p,如要把整型变量a
的地址赋予p可以有以下两种方式:
(1)指针变量初始化的方法
int
a;
int
*p=&a;
(2)赋值语句的方法
int
a;
int
*p;
p=&a;
不允许把一个数赋予指针变量,故下面的赋值是错误的:
int
*p;
p=1000;
被赋值的指针变量前不能再加“*”说明符,如写为*p=&a
也是错误的。
假设:
int
i=200,
x;
int
*ip;
我们定义了两个整型变量i,x,还定义了一个指向整型数的指针变量ip。i,x中可存放整数,而ip中只能存放整型变量的地址。我们可以把i的地址赋给ip:
ip=&i;
此时指针变量ip指向整型变量i,假设变量i的地址为1800,这个赋值可形象理解为下图所示的联系。
以后我们便可以通过指针变量ip间接访问变量i,例如:
x=*ip;
运算符*访问以ip为地址的存贮区域,而ip中存放的是变量i的地址,因此,*ip访问的是地址为1800的存贮区域(因为是整数,实际上是从1800开始的两个字节),它就是i所占用的存贮区域,
所以上面的赋值表达式等价于
x=i;
相似回答