首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问 p1=str1; 和 p1=&str1; 有啥区别

2013-10-23 
请教 p1str1 和 p1&str1 有啥区别charstr1[256]charstr2[256]char* p1char* p2请教p1str1p2str

请教 p1=str1; 和 p1=&str1; 有啥区别
char        str1[256];
char        str2[256];
char* p1;
char* p2;

请教
p1=str1;
p2=str2;

p1=&str1;
p2=&str2;
有啥区别?
谢谢

[解决办法]
p1=str1;
p2=str2;

p1=&str1;
p2=&str2;
有啥区别?

p1 = str1;取得是str1的地址
p1=&str1; 取得是str1地址的地址


[解决办法]
就使用上来说,没有区别
[解决办法]
对于数组来讲,没什么区别,&了还是一样。指针就不一样了。
[解决办法]
使用起来好像是没啥
[解决办法]

引用:
Quote: 引用:

对于数组来讲,没什么区别,&了还是一样。指针就不一样了。

啥是:“指针就不一样了”?
谢谢
对数组来说,str1和&str1都可以隐式转换为对应元素类型的指针
但指针的话str1是指针类型,&str1是指向指针的指针类型,两者不能转换了

1楼的是错的
[解决办法]
引用:
Quote: 引用:

p1 = str1;取得是str1的地址
p1=&str1; 取得是str1地址的地址

谢谢,啥是:“p1=&str1; 取得是str1地址的地址”?

比如str1的地址是0x4567
p1 = str1;
p1已经存在一个4字节的变量地址了。
char *p2;
p1 = str1;
p2 = &p1 <==> p2 = &str1;
p2存的就是指针p1指针变量的地址
[解决办法]
p1已经存在一个4字节的变量地址了
里面的值是0x4567
 
假设p1指针变量的地址是0x99999
那么p2里面的值就是0x99999
但是p2本身的地方也有一个地址
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

p1 = str1;取得是str1的地址
p1=&str1; 取得是str1地址的地址

谢谢,啥是:“p1=&str1; 取得是str1地址的地址”?

比如str1的地址是0x4567
p1 = str1;
p1已经存在一个4字节的变量地址了。
char *p2;
p1 = str1;
p2 = &p1 <==> p2 = &str1;
p2存的就是指针p1指针变量的地址
所以说你的是错的
p2 = &p1 <==> p2 = &str1;
这句就不成立str1的值是数组所在位置,&str1也是数组所在位置,&p1和&str1怎么可能相等,p1和str1是2个不同的变量
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
但我又不得不承认:
 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物;
 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。
而我本人属前者。

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

十字链表交换任意两个节点C源代码(C指针应用终极挑战)http://download.csdn.net/detail/zhao4zhong1/5532495

[解决办法]
p1=str1;
p2=str2;

p1=&str1;
p2=&str2;
有啥区别?
单纯的使用数组你是看不出来区别的,再次我做一个简单的例子。
#include<stdio.h>
void main()
{

char a[] = {'a','b','c','d','e','h'};
char *p;
p = (char *)(&a+1);

printf("sss %c\n",*(p-1));
}

输出的结果是h,因为&a表示的数组的首地址,&a+1相当于指针偏移量为size(a)+首地址a,
所以说,a等效于&a[0]相当于数组元素的首地址,&a表示数组的首地址。
你再此处这样写意义不大

[解决办法]
二者完全不同,第一个不报错,第二个类型不兼容,编译不过去.
char        str[256];
char (*p)[256] =&str ;才行.
char *p = &str ;编译不能通过.

[解决办法]
    首先得明白个概念,数组名,函数名都有入口地址的功能,因为数组和函数是分配连续的内存空间,而数组名和函数名就代表着该连续空间的首地址,通过访问首地址就能找到所有的内容。所以可以将数组名或函数名赋值给相应的指针。另一方面,比如数组char str[30];数组名str和&str[0]是同一个地址,上述char *p = &str能够运行成功,可能是经过了


char *p = &str[0]的隐式转换。

[解决办法]

引用:
二者完全不同,第一个不报错,第二个类型不兼容,编译不过去.
char        str[256];
char (*p)[256] =&str ;才行.
char *p = &str ;编译不能通过.

++
char *p=&str确实不能通过
[解决办法]
这个应该是编译不过的,二级指针
[解决办法]
p1=str1;应该和p1=&str1[0];的意思一样, 都是p1指向数组的第一个元素。
但如果p1=&str1,应该是编译不过的。
[解决办法]
编译能通过吗?类型不对应吧?
[解决办法]
完全不是一个东西! 一个赋值指针指向的地址!一个是赋值指针本身的地址!
[解决办法]
引用:
Quote: 引用:

完全不是一个东西! 一个赋值指针指向的地址!一个是赋值指针本身的地址!

"赋值指针本身的地址" 指针地址和某个变量相同,那不是重叠了?


只是把地址的值给它而已!也就是说p1的内存空间上存放的内容是str1的地址值而已!
但是p1的地址又有另外一块内存空间的!千万这里要理解清楚,不要弄混了!

热点排行