请问一下这个代码里的int p2=p;是正确的吗,为什么是和p2= &p的效果一样吗, 可以写成*p2=*p;吗
下面是我的理解,仅供参考:
请问一下这个代码里的int p2=p;是正确的吗
---->
(int *p2) = p 这个是正确的,因为p和p2都是int型指针,对其赋值是正确的。
为什么是和p2= &p的效果一样吗
---->
p2是不能赋值为&p的,因为&p是int型指针的指针,而p2是int型指针,二者类型不匹配。
可以写成(*p2)=(*p);吗
---->
(int *p2)=(*p); 是不可以的,因为定义时赋值,p2代表指针,(*p)代表一个int值,二者类型不匹配。
先定义了(int *p2;) ,然后在赋值也不可以,(*p2)没有指向某个int型数据 , p2就是一个野指针,对其赋值为(*p)会产生难以预料的结果。
下面是测试的例子:
#include <stdio.h>
int main(void){
printf("Hello, world!\n");
int a=22;
int *p = &a;
*p=24;
int b=1;
int *p2 = &b;
*p2=*p;
int **p3=&p2;
(*p2)--;
(**p3)-=10;
printf("%d %d %d\n",a,*p,*p2);
return 0;
}
请问一下这个代码里的int p2=p;是正确的吗,为什么是和p2= &p的效果一样吗, 可以写成*p2=*p;吗
int *p2=p和int p2,p2=p;效果是一样的。而且和p2=&a;效果一样,因为p指向a的地址,p赋值给p2,那么p2也指向a的地址;
如果写成p2=*p,是可以的,意思是p代表的值赋给p2的值
int a = 22; // 定义变量 a 赋值 22
int p = &a; // 定义指针p指向a的地址,则p的值为22
p = 24; // 给p重新赋值24,由于指针p指向a的地址,故a的值被修改为24
int p2 = p; // 定义指针p2并将指针p赋值给p2,则p2和p同指向a的地址,p2的值为24
int p3 = &p2;// 定义指针p3指向p2的地址,由于p2指向a,所以p3也指向a,p3的值为24
此时,p、p2、p3三个指针均指向a的地址,a、p、*p2、**p3的值相同,无论修改哪一个,其实都是修改的a的值。
(p2)--; // p2的值-- ,此时a、p、p2、**p3均为23
(*p3) -= 10; // (p3)的值 -10,此时a、p、p2、p3均为13
int p2=p是不正确的,因为p2不是指针,p是指针,由于p2和p都是指针,所以不能p2 = &p,p2=*p可以在声明p2之后这么写,即int *p2; *p2=*p;声明时候不能这么写。
请问一下这个代码里的int p2=p;是正确的吗,为什么是和p2= &p的效果一样吗, 可以写成*p2=*p;吗
int *p2=p和int p2,p2=p;效果是一样的。而且和p2=&a;效果一样,因为p指向a的地址,p赋值给p2,那么p2也指向a的地址;
如果写成p2=*p,是可以的,意思是p代表的值赋给p2的值