困扰很久的白痴问题!

时间:2020-12-01 00:21:20
int *p=null;

int i=5;

*p=i;

p=&i;

*p=&i;

p=i;




上述各种赋值方法,到底何区别?大侠··

17 个解决方案

#1



int *p=null;

int i=5;

*p=i; //出错  还没有指向某个地址 就取值了

p=&i; //对的 最常见的用法

*p=&i; //类型不一致

p=i;  //类型不一致 出错

#2


*p=i;和p=&i;一样的...

*p=&i;和p=i;一样的...不过p=i要类型转换下p=(int*)i;

多看看指针相关的内容吧...

#3


引用 1 楼 yuyan_linger 的回复:
C/C++ code

int *p=null;

int i=5;

*p=i; //出错  还没有指向某个地址 就取值了

p=&i; //对的 最常见的用法

*p=&i; //类型不一致

p=i;  //类型不一致 出错


第一个我到某本书上看到过这个用法,第三个我看过***p=&i的用法, 就是前面有三个*;
麻烦解释下,是书上的错误吗?我打算换一本书·

#4



int *p=null;
int i=5;

*p=i;//这个是对指针P所指的内存位置赋值(要是p为野指针或指null的话会报错)
p=&i;//这个是把i的地址赋给p
*p=&i;//这个类型不匹配
p=i;//这个类型不匹配

#5


int *p=null;-----整形指针p赋值为空

int i=5;-----整形i赋值为5

*p=i;----指针p解引用用变量i赋值

p=&i;----指针p指向整形变量i的地址

*p=&i;--错误

p=i; --错误  
不同类型变量不能互相赋值

#6


引用 4 楼 wizard_tiger 的回复:
C/C++ code

int *p=null;
int i=5;

*p=i;//这个是对指针P所指的内存位置赋值(要是p为野指针或指null的话会报错)
p=&i;//这个是把i的地址赋给p
*p=&i;//这个类型不匹配
p=i;//这个类型不匹配



正解~~

#7


引用 2 楼 lanxue_1988 的回复:
*p=i;和p=&i;一样的...

*p=&i;和p=i;一样的...不过p=i要类型转换下p=(int*)i;

多看看指针相关的内容吧...


我也知道是一样的说法,但是,不明白其中的机制,举例说明下,各个时候 P 、I各个的值,和类型!
谢谢了~~~~~~~~~~

#8


int *p=&i 和 *p=&i


前一个的意思是不是可以大概写成这样 int *(p=&i)   /   后一个就是错的了吗?如果i变量内存里面恰好也是个指针类型的就可以了如i的值为0000fff00 是吗?

#9


引用 8 楼 liaoyibiao1987 的回复:
C/C++ code
int *p=&i 和 *p=&i


前一个的意思是不是可以大概写成这样 int *(p=&i)   /   后一个就是错的了吗?如果i变量内存里面恰好也是个指针类型的就可以了如i的值为0000fff00 是吗?


int *p = &i; 这叫做 定义时 赋值
展开看
int *p;
p = &i;

*p = &i;
没有这么干的

#10


引用 7 楼 liaoyibiao1987 的回复:
引用 2 楼 lanxue_1988 的回复:

*p=i;和p=&i;一样的...

*p=&i;和p=i;一样的...不过p=i要类型转换下p=(int*)i;

多看看指针相关的内容吧...


我也知道是一样的说法,但是,不明白其中的机制,举例说明下,各个时候 P 、I各个的值,和类型!
谢谢了~~~~~~~~~~


额,,,刚才我说的不对...差点误人子弟- -


其实指针p存储的是内存的地址....通过*p来访问该地址存储的数据
int *p=null;  //p=0; 
int i=5;   //变量i=5;假设i的内存地址:0x00abcedf
*p=i;  //地址为0的内存区域被赋值5...这句有问题...
 p=&i;//p=0x00abcedf,即i的内存地址..这句没问题...
 *p=&i;//p指向的内存区域被赋值0x00abcedf也需要类型转化*p=(int)&i;
 p=i;  //这句需要类型转换...p=(int*)i....p=5

#11


VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

#12


 现在从事.NET开发,突然觉得.net太白痴,就想学学以前读书时的C语言和数据结构。


回复11楼的兄弟,我其实以前也想从事C++或汇编的,早就认识了他的强大,但是无奈老师讲过一遍汇编,让我从清晰逐渐走向糊涂,然后走向深渊,最后放弃。。。现在汇编的书都给卖了··其余的C语言和C++还留着···哎·····

#13


引用 2 楼 lanxue_1988 的回复:
*p=i;和p=&i;一样的...

*p=&i;和p=i;一样的...不过p=i要类型转换下p=(int*)i;

多看看指针相关的内容吧...
二楼上面说的没一句是对的。
*p =i p =&i 怎能一样呢?前者是指针p已经指向一个有效地址,然后把指向的地址赋值为与i相同的值,实际是有内存复制的过程,后者是将指针p直接指向变量i所在的内存,改变了指针的指向,并没有复制数据。
再看后面,*p =&i ,p =(int *)i 
前者p仍然已指向(假设,若非就出错)一个有效地址,将这个地址里的内容赋值为i的地址,后者是改变指针p的指向为变量i的内容,这两个都意义不大,假设:变量i地址为1FFF0,其内容是整数10,那么,*p =&i 指针指向的内容变成1FFF0,p =(int *)i,指针指向转为10 这个地址,而地址10处的内容是什么就完全不知道了……二楼纯属误人子弟,像这样的事情我发现这个论坛还有不少,希望大家能多思考,把正确的东西讨论出来,不要让错误的结论流传起来。   

#14


int *p=null;//定义整形指针p,给p赋初值为空;

int i=5;//定义整形变量i,赋初值为5;

*p=i;//VC6.0 让P所指向的值为i的值。编译通过,但是运行是出错;

p=&i;// 让指针P指向i的地址,此时*p的值是5,编译通过正常运行;

*p=&i;//VC6.0编译报错,不能给一个*p为整形,&i为类型为整形指针,不同类型不能赋值(强制类型转换可编译通过);

p=i;//VC6.0编译报错,P为整形指针,i为整形,不同类型不能赋值(强制类型转换可编译通过);

#15


#14楼

对了,我就想大概知道强制转换后的值,我知道有随机性,但是只要举个例子!!!

#16


引用 12 楼 liaoyibiao1987 的回复:
现在从事.NET开发,突然觉得.net太白痴,就想学学以前读书时的C语言和数据结构。


回复11楼的兄弟,我其实以前也想从事C++或汇编的,早就认识了他的强大,但是无奈老师讲过一遍汇编,让我从清晰逐渐走向糊涂,然后走向深渊,最后放弃。。。现在汇编的书都给卖了··其余的C语言和C++还留着···哎·····

不是学习用汇编编代码;而是学习每句C对应的汇编。这是两个不同的概念。

#17



int *p=null;//p是一指针,地址为null

int i=5;//i是一整型变量

*p=i;//给地址为“p的值”的内存位置赋整型值i,此时p的值为null,有错

p=&i;//将“p的值”赋为i的地址,此时p的值为i的地址

*p=&i;//给地址为“p的值”的内存位置赋i的地址

p=i;//将“p的值”赋为i

#1



int *p=null;

int i=5;

*p=i; //出错  还没有指向某个地址 就取值了

p=&i; //对的 最常见的用法

*p=&i; //类型不一致

p=i;  //类型不一致 出错

#2


*p=i;和p=&i;一样的...

*p=&i;和p=i;一样的...不过p=i要类型转换下p=(int*)i;

多看看指针相关的内容吧...

#3


引用 1 楼 yuyan_linger 的回复:
C/C++ code

int *p=null;

int i=5;

*p=i; //出错  还没有指向某个地址 就取值了

p=&i; //对的 最常见的用法

*p=&i; //类型不一致

p=i;  //类型不一致 出错


第一个我到某本书上看到过这个用法,第三个我看过***p=&i的用法, 就是前面有三个*;
麻烦解释下,是书上的错误吗?我打算换一本书·

#4



int *p=null;
int i=5;

*p=i;//这个是对指针P所指的内存位置赋值(要是p为野指针或指null的话会报错)
p=&i;//这个是把i的地址赋给p
*p=&i;//这个类型不匹配
p=i;//这个类型不匹配

#5


int *p=null;-----整形指针p赋值为空

int i=5;-----整形i赋值为5

*p=i;----指针p解引用用变量i赋值

p=&i;----指针p指向整形变量i的地址

*p=&i;--错误

p=i; --错误  
不同类型变量不能互相赋值

#6


引用 4 楼 wizard_tiger 的回复:
C/C++ code

int *p=null;
int i=5;

*p=i;//这个是对指针P所指的内存位置赋值(要是p为野指针或指null的话会报错)
p=&i;//这个是把i的地址赋给p
*p=&i;//这个类型不匹配
p=i;//这个类型不匹配



正解~~

#7


引用 2 楼 lanxue_1988 的回复:
*p=i;和p=&i;一样的...

*p=&i;和p=i;一样的...不过p=i要类型转换下p=(int*)i;

多看看指针相关的内容吧...


我也知道是一样的说法,但是,不明白其中的机制,举例说明下,各个时候 P 、I各个的值,和类型!
谢谢了~~~~~~~~~~

#8


int *p=&i 和 *p=&i


前一个的意思是不是可以大概写成这样 int *(p=&i)   /   后一个就是错的了吗?如果i变量内存里面恰好也是个指针类型的就可以了如i的值为0000fff00 是吗?

#9


引用 8 楼 liaoyibiao1987 的回复:
C/C++ code
int *p=&i 和 *p=&i


前一个的意思是不是可以大概写成这样 int *(p=&i)   /   后一个就是错的了吗?如果i变量内存里面恰好也是个指针类型的就可以了如i的值为0000fff00 是吗?


int *p = &i; 这叫做 定义时 赋值
展开看
int *p;
p = &i;

*p = &i;
没有这么干的

#10


引用 7 楼 liaoyibiao1987 的回复:
引用 2 楼 lanxue_1988 的回复:

*p=i;和p=&i;一样的...

*p=&i;和p=i;一样的...不过p=i要类型转换下p=(int*)i;

多看看指针相关的内容吧...


我也知道是一样的说法,但是,不明白其中的机制,举例说明下,各个时候 P 、I各个的值,和类型!
谢谢了~~~~~~~~~~


额,,,刚才我说的不对...差点误人子弟- -


其实指针p存储的是内存的地址....通过*p来访问该地址存储的数据
int *p=null;  //p=0; 
int i=5;   //变量i=5;假设i的内存地址:0x00abcedf
*p=i;  //地址为0的内存区域被赋值5...这句有问题...
 p=&i;//p=0x00abcedf,即i的内存地址..这句没问题...
 *p=&i;//p指向的内存区域被赋值0x00abcedf也需要类型转化*p=(int)&i;
 p=i;  //这句需要类型转换...p=(int*)i....p=5

#11


VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

#12


 现在从事.NET开发,突然觉得.net太白痴,就想学学以前读书时的C语言和数据结构。


回复11楼的兄弟,我其实以前也想从事C++或汇编的,早就认识了他的强大,但是无奈老师讲过一遍汇编,让我从清晰逐渐走向糊涂,然后走向深渊,最后放弃。。。现在汇编的书都给卖了··其余的C语言和C++还留着···哎·····

#13


引用 2 楼 lanxue_1988 的回复:
*p=i;和p=&i;一样的...

*p=&i;和p=i;一样的...不过p=i要类型转换下p=(int*)i;

多看看指针相关的内容吧...
二楼上面说的没一句是对的。
*p =i p =&i 怎能一样呢?前者是指针p已经指向一个有效地址,然后把指向的地址赋值为与i相同的值,实际是有内存复制的过程,后者是将指针p直接指向变量i所在的内存,改变了指针的指向,并没有复制数据。
再看后面,*p =&i ,p =(int *)i 
前者p仍然已指向(假设,若非就出错)一个有效地址,将这个地址里的内容赋值为i的地址,后者是改变指针p的指向为变量i的内容,这两个都意义不大,假设:变量i地址为1FFF0,其内容是整数10,那么,*p =&i 指针指向的内容变成1FFF0,p =(int *)i,指针指向转为10 这个地址,而地址10处的内容是什么就完全不知道了……二楼纯属误人子弟,像这样的事情我发现这个论坛还有不少,希望大家能多思考,把正确的东西讨论出来,不要让错误的结论流传起来。   

#14


int *p=null;//定义整形指针p,给p赋初值为空;

int i=5;//定义整形变量i,赋初值为5;

*p=i;//VC6.0 让P所指向的值为i的值。编译通过,但是运行是出错;

p=&i;// 让指针P指向i的地址,此时*p的值是5,编译通过正常运行;

*p=&i;//VC6.0编译报错,不能给一个*p为整形,&i为类型为整形指针,不同类型不能赋值(强制类型转换可编译通过);

p=i;//VC6.0编译报错,P为整形指针,i为整形,不同类型不能赋值(强制类型转换可编译通过);

#15


#14楼

对了,我就想大概知道强制转换后的值,我知道有随机性,但是只要举个例子!!!

#16


引用 12 楼 liaoyibiao1987 的回复:
现在从事.NET开发,突然觉得.net太白痴,就想学学以前读书时的C语言和数据结构。


回复11楼的兄弟,我其实以前也想从事C++或汇编的,早就认识了他的强大,但是无奈老师讲过一遍汇编,让我从清晰逐渐走向糊涂,然后走向深渊,最后放弃。。。现在汇编的书都给卖了··其余的C语言和C++还留着···哎·····

不是学习用汇编编代码;而是学习每句C对应的汇编。这是两个不同的概念。

#17



int *p=null;//p是一指针,地址为null

int i=5;//i是一整型变量

*p=i;//给地址为“p的值”的内存位置赋整型值i,此时p的值为null,有错

p=&i;//将“p的值”赋为i的地址,此时p的值为i的地址

*p=&i;//给地址为“p的值”的内存位置赋i的地址

p=i;//将“p的值”赋为i