user-0 提问: 指针的问题，大家看看啊！

回复:
user: user-0
content: 谢谢各位指点！

user: user-1
content: 引用 8 楼 ruying1389279 的回复:*p2 = *p1 是把p1所指向的对象赋予p2所指向的对象，是这样吗？ 是的。 不过措辞不严谨。 是把p1所指向的对象的值赋予p2所指向的对象。

user: user-0
content: *p2 = *p1 是把p1所指向的对象赋予p2所指向的对象，是这样吗？

user: user-1
content: 引用 6 楼 ruying1389279 的回复:[quote=引用 5 楼 sholber 的回复:] int * p1, * p2;//定义两个指针p1,p2 严格地说，这是声明。char * p1 = 0才是定义。  p1 = &i; //指针p1取变量i的地址,即p1 = 5; p2 = &j; //指针p2取变量j的地址,即p2 = 10; 这是胡说。p1永远不可能去取变量i的地址，那是一元&运算符的功能。运算符&的结果类型是指针，只是因为=运算符的右操作数是指针，同左操作数的类型相同，所以才允许赋值。  *p1 = 10; //给指针p1赋值为10 既p1 = 10; i = 10; 胡说。每个指针都属于完整类型，是一个独立的对象。所以，p1是一个独立的对象，它所指向的是另一个对象，也就是i。一元*运算符对指针解引用，指示对象i。最终，这条语句的意思是给指针pi所指向的对象赋值。  *p2 = *p1;//把指针p1的地址赋予指针p2 即p2=p1=i=10 狗屁不通。请参考上一条的解释。是将指针p2所指向的对象的值赋给指针p1所指向的对象。   p1 = p2;//把指针p2的地址赋予p1;这里最后指向的还是p1的地址，因为上一句已经将p1的地址赋予了p2，所以这时候p1和p2的地址都是p1的地址 傻瓜，看黄书看多了，离开个“地址”这个名词，就不能解释程序的意义了？因为指针也是对象，所以，是将指针p2的值赋给p1。这样，两个指针具有相同的值，并因此指向同一个对象。  *p1 = 20;//把20赋予了指针p1 胡说，参考上面的解释。  printf("i = %d\nj = %d\n",*p1,*p2);//p1 p2的值都为20 傻！p1和p2都是指针，*p1和*p2的结果指示指针所指向的对象。 谢谢指点 那*p1 = 10;的意思就是 把10赋予指针p1所指向的对象变量i，也就是改变i的值 还有*p2 = *p1 是把p2所指向的对象赋予p1所指向的对象。 不是把p1所指向的对象赋予p2所指向的对象吗？，写程序验证了下 int main(void) { 	int i = 10,j = 100; 	int *p1 = &i,*p2 = &j; 	*p2 = *p1; 	printf("%d\n",*p2); 	system("pause"); 	return 0;  } 打印的p2值是p1所指向的值 [/quote]  第一条你说得对， 第二条，你说反了。

user: user-0
content: 引用 5 楼 sholber 的回复:int * p1, * p2;//定义两个指针p1,p2 严格地说，这是声明。char * p1 = 0才是定义。  p1 = &i; //指针p1取变量i的地址,即p1 = 5; p2 = &j; //指针p2取变量j的地址,即p2 = 10; 这是胡说。p1永远不可能去取变量i的地址，那是一元&运算符的功能。运算符&的结果类型是指针，只是因为=运算符的右操作数是指针，同左操作数的类型相同，所以才允许赋值。  *p1 = 10; //给指针p1赋值为10 既p1 = 10; i = 10; 胡说。每个指针都属于完整类型，是一个独立的对象。所以，p1是一个独立的对象，它所指向的是另一个对象，也就是i。一元*运算符对指针解引用，指示对象i。最终，这条语句的意思是给指针pi所指向的对象赋值。  *p2 = *p1;//把指针p1的地址赋予指针p2 即p2=p1=i=10 狗屁不通。请参考上一条的解释。是将指针p2所指向的对象的值赋给指针p1所指向的对象。   p1 = p2;//把指针p2的地址赋予p1;这里最后指向的还是p1的地址，因为上一句已经将p1的地址赋予了p2，所以这时候p1和p2的地址都是p1的地址 傻瓜，看黄书看多了，离开个“地址”这个名词，就不能解释程序的意义了？因为指针也是对象，所以，是将指针p2的值赋给p1。这样，两个指针具有相同的值，并因此指向同一个对象。  *p1 = 20;//把20赋予了指针p1 胡说，参考上面的解释。  printf("i = %d\nj = %d\n",*p1,*p2);//p1 p2的值都为20 傻！p1和p2都是指针，*p1和*p2的结果指示指针所指向的对象。 谢谢指点 那*p1 = 10;的意思就是 把10赋予指针p1所指向的对象变量i，也就是改变i的值 还有*p2 = *p1 是把p2所指向的对象赋予p1所指向的对象。 不是把p1所指向的对象赋予p2所指向的对象吗？，写程序验证了下 int main(void) { 	int i = 10,j = 100; 	int *p1 = &i,*p2 = &j; 	*p2 = *p1; 	printf("%d\n",*p2); 	system("pause"); 	return 0;  } 打印的p2值是p1所指向的值

user: user-1
content: int * p1, * p2;//定义两个指针p1,p2 严格地说，这是声明。char * p1 = 0才是定义。  p1 = &i; //指针p1取变量i的地址,即p1 = 5; p2 = &j; //指针p2取变量j的地址,即p2 = 10; 这是胡说。p1永远不可能去取变量i的地址，那是一元&运算符的功能。运算符&的结果类型是指针，只是因为=运算符的右操作数是指针，同左操作数的类型相同，所以才允许赋值。  *p1 = 10; //给指针p1赋值为10 既p1 = 10; i = 10; 胡说。每个指针都属于完整类型，是一个独立的对象。所以，p1是一个独立的对象，它所指向的是另一个对象，也就是i。一元*运算符对指针解引用，指示对象i。最终，这条语句的意思是给指针pi所指向的对象赋值。  *p2 = *p1;//把指针p1的地址赋予指针p2 即p2=p1=i=10 狗屁不通。请参考上一条的解释。是将指针p2所指向的对象的值赋给指针p1所指向的对象。   p1 = p2;//把指针p2的地址赋予p1;这里最后指向的还是p1的地址，因为上一句已经将p1的地址赋予了p2，所以这时候p1和p2的地址都是p1的地址 傻瓜，看黄书看多了，离开个“地址”这个名词，就不能解释程序的意义了？因为指针也是对象，所以，是将指针p2的值赋给p1。这样，两个指针具有相同的值，并因此指向同一个对象。  *p1 = 20;//把20赋予了指针p1 胡说，参考上面的解释。  printf("i = %d\nj = %d\n",*p1,*p2);//p1 p2的值都为20 傻！p1和p2都是指针，*p1和*p2的结果指示指针所指向的对象。

user: user-2
content: 擦，上面的乱了，再发一次  Memory addr  MEM             +----+ 0xef000010  |0x00|             +----+ 0xef000011  |0x19| p2 = 0xef000019 (4 byte)             +----+ 0xef000012  |0x00|             +----+ 0xef000013  |0x00|             +----+ 0xef000014  |0xef|             +----+ 0xef000015  |0x1d| p1 = 0xef00001d (4 byte)             +----+ 0xef000016  |0x00|             +----+ 0xef000017  |0x00|             +----+ 0xef000018  |0xef|             +----+ 0xef000019  |0x02| j = 0x00000002 (4 byte)             +----+ 0xef00001a  |0x00|             +----+ 0xef00001b  |0x00|             +----+ 0xef00001c  |0x00|             +----+ 0xef00001d  |0x01| i = 0x00000001 (4 byte)             +----+ 0xef00001e  |0x00|             +----+ 0xef00001f  |0x00|             +----+ 0xef000020  |0x00|             +----+

user: user-2
content: int i = 1, j = 2, *p1 = &i, *p2 = &j; // 定义4个变量 下面模拟执行到上面一行的内存布局，你要是能看懂那就没问题了  <Memory addr><MEM> 		        +----+ 0xef000010  |0x00| 		        +----+ 0xef000011  |0x19| p2 = 0xef000019 (4 byte) 		        +----+ 0xef000012  |0x00| 		        +----+ 0xef000013  |0x00| 		        +----+ 0xef000014  |0xef| 		        +----+ 0xef000015  |0x1d| p1 = 0xef00001d (4 byte) 		        +----+ 0xef000016  |0x00| 		        +----+ 0xef000017  |0x00| 		        +----+ 0xef000018  |0xef| 		        +----+ 0xef000019  |0x02| j = 0x00000002 (4 byte) 		        +----+ 0xef00001a  |0x00| 		        +----+ 0xef00001b  |0x00| 		        +----+ 0xef00001c  |0x00| 		        +----+ 0xef00001d  |0x01| i = 0x00000001 (4 byte) 		        +----+ 0xef00001e  |0x00| 		        +----+ 0xef00001f  |0x00| 		        +----+ 0xef000020  |0x00| 		        +----+

user: user-3
content: 1.*p=10；表示将p所指向内容赋值为10，而p是不变的，即所指向地址不变，但这个地址中的内容改变。 3.显然不是 4.p表示一个地址，*p表示这个地址中的内容，都可以输出，只是看你想要看的是地址还是地址中的内容。

user: user-4
content: 3.p1 = p2 是不是等同于 *p1 = *p2 不等同于  p1 p2分别保存的是地址   *p1 与*p2的作用是 按照指针的类型 去所在地址 进行取值  如int *p1  假设p1变量保存的值是 0x80808080 那么*p1就是去这个地址 取4个字节 做为一个int型的数。（32位系统） char *p1则是取到第一个/0才结束。所以p1 = p2 就相当于p1 看世界的方式改变(它要看什么) 它们的赋值 并不能直接改变世界的存在。指针就是看世界的方式. 当然 最后看世界的目的是方便的引用到这个世界并可以改变这个世界。 4.printf()函数打印指针，只能%d%d,*p1,*p2打印吗？为什么%d%d,p1,p2这样打印不行呢？ int i = 5, j = 10;（真实世界）  p1 = &i; p2 = &j;（看世界）  一个是真实的世界  一个是我拿什么看世界 肯定不一样啊。