强制转换指针类型问题

时间:2021-04-01 18:56:59
int a[10]={1};
char *p;
(int *)p=a;

这里如何错了?
VC 6.0 报错原因

D:\VC++ 6.0\VC2009\Common\test.cpp(13) : error C2106: '=' : left operand must be l-value

22 个解决方案

#1


强制转换类型产生的是临时变量
不能给他赋值

#2


左值问题~
C/C++ 不支持这么写。。。

#3


引用 1 楼 q191201771 的回复:
强制转换类型产生的是临时变量
不能给他赋值

#4


那谁知道怎样强制转换指针类型?

#5


int a[10]={1};
char *p;
p=(char *)a;
C里面指针类型不能变的

#6


引用 5 楼 flyrack 的回复:
int a[10]={1};
char *p;
p=(char *)a;
C里面指针类型不能变的

正解

#7


引用 5 楼 flyrack 的回复:
int a[10]={1};
char *p;
p=(char *)a;
C里面指针类型不能变的

#8


void类型的指针也不行吗?比如void *p

#9


void *其实这样理解,它是所有各种指针的范称,你可以将任意的指针都赋值个他
比如char *p;void *x;x = p;为什么能这样呢?首先在32位操作系统上任意指针大小都是4字节,你可以用
sizeof(void *)测试。指针其实也就是一个变量,这个变量里面存的都是4字节(32位)的整数。只是变量地址指向的内容各有差异吧了。
楼主的错误就是 楼上说的··

#10


error C2106: '=' : left operand must be l-value

left operand must be l-value是说:运算符的左边应该是一个“左值”。所谓“左值”就是指在程序中占用内存空间、可以被修改的量,比如各种变量。
而(int *)p,让p成为了一个临时变量非左值

#11


嗯,学习了啊。

#12


5楼正解。

#13


#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
int a[10]={1};
char *p;
//(int *)p=a;
int* q = (int*)p;
return 0;
}
编译没问题,1楼,10楼回答正确,5楼回答错误,楼上的一些人你们难道不能实践一下?

#14


int a[10]={1};
char *p;
*((int **))p=(int *)a;

#15


VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

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

“VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

#16


引用楼主 mweibiao 的回复:
int a[10]={1};
char *p;
(int *)p=a;

这里如何错了?
VC 6.0 报错原因

D:\VC++ 6.0\VC2009\Common\test.cpp(13) : error C2106: '=' : left operand must be l-value


lz 直接将 p 声明为 int* 不就行了,为何要先建一个超市,然后再将它改为食堂?

看看 强制转换的对象是谁?

#17


引用 9 楼 firefoxbug 的回复:
void *其实这样理解,它是所有各种指针的范称,你可以将任意的指针都赋值个他
比如char *p;void *x;x = p;为什么能这样呢?首先在32位操作系统上任意指针大小都是4字节,你可以用
sizeof(void *)测试。指针其实也就是一个变量,这个变量里面存的都是4字节(32位)的整数。只是变量地址指向的内容各有差异吧了。
楼主的错误就是 楼上说的··


难道说
int a[10]={1},i=0;
void *p;
p=a;
for(i=0;i<10;i++)
cout<<*(p+i);

正确?

#18


引用 16 楼 anyidan 的回复:
引用楼主 mweibiao 的回复:
int a[10]={1};
char *p;
(int *)p=a;

这里如何错了?
VC 6.0 报错原因

D:\VC++ 6.0\VC2009\Common\test.cpp(13) : error C2106: '=' : left operand must be l-value


lz 直接将 p 声明为 int* 不就行……


我现在是不知道类型,要根据用户输入才能确定

#19


可以试下不定参数,本质是一个宏,要正确理解才能知道如何使用
代码像下面这样
void demo( int n, ... )
{
    va_list argp; /* 定义保存函数参数的结构 */
    int para; /* 存放取出的字符串参数 */
    /* argp指向传入的第一个可选参数,
    msg是最后一个确定的参数 */
    va_start(argp,n);
    while (n--)
    {
        para = va_arg(argp,char*);
        printf("%s\n",para);
    }
    va_end( argp ); /* 将argp置为NULL */
}

int main()
{
demo(4,"1","111","3.0","4");
    return 0;
}

#20


学习~~~

#21


c\c++交流群147325003

#22


引用 6 楼 agoago_2009 的回复:
引用 5 楼 flyrack 的回复:
int a[10]={1};
char *p;
p=(char *)a;
C里面指针类型不能变的

正解

++

楼主 error C2106: '=' : left operand must be l-value  这个错误明白不。 
先看看最基本的书。 赋值怎么赋值, 谁应该放在=号左边谁应该放在=右右边

#1


强制转换类型产生的是临时变量
不能给他赋值

#2


左值问题~
C/C++ 不支持这么写。。。

#3


引用 1 楼 q191201771 的回复:
强制转换类型产生的是临时变量
不能给他赋值

#4


那谁知道怎样强制转换指针类型?

#5


int a[10]={1};
char *p;
p=(char *)a;
C里面指针类型不能变的

#6


引用 5 楼 flyrack 的回复:
int a[10]={1};
char *p;
p=(char *)a;
C里面指针类型不能变的

正解

#7


引用 5 楼 flyrack 的回复:
int a[10]={1};
char *p;
p=(char *)a;
C里面指针类型不能变的

#8


void类型的指针也不行吗?比如void *p

#9


void *其实这样理解,它是所有各种指针的范称,你可以将任意的指针都赋值个他
比如char *p;void *x;x = p;为什么能这样呢?首先在32位操作系统上任意指针大小都是4字节,你可以用
sizeof(void *)测试。指针其实也就是一个变量,这个变量里面存的都是4字节(32位)的整数。只是变量地址指向的内容各有差异吧了。
楼主的错误就是 楼上说的··

#10


error C2106: '=' : left operand must be l-value

left operand must be l-value是说:运算符的左边应该是一个“左值”。所谓“左值”就是指在程序中占用内存空间、可以被修改的量,比如各种变量。
而(int *)p,让p成为了一个临时变量非左值

#11


嗯,学习了啊。

#12


5楼正解。

#13


#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
int a[10]={1};
char *p;
//(int *)p=a;
int* q = (int*)p;
return 0;
}
编译没问题,1楼,10楼回答正确,5楼回答错误,楼上的一些人你们难道不能实践一下?

#14


int a[10]={1};
char *p;
*((int **))p=(int *)a;

#15


VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

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

“VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

#16


引用楼主 mweibiao 的回复:
int a[10]={1};
char *p;
(int *)p=a;

这里如何错了?
VC 6.0 报错原因

D:\VC++ 6.0\VC2009\Common\test.cpp(13) : error C2106: '=' : left operand must be l-value


lz 直接将 p 声明为 int* 不就行了,为何要先建一个超市,然后再将它改为食堂?

看看 强制转换的对象是谁?

#17


引用 9 楼 firefoxbug 的回复:
void *其实这样理解,它是所有各种指针的范称,你可以将任意的指针都赋值个他
比如char *p;void *x;x = p;为什么能这样呢?首先在32位操作系统上任意指针大小都是4字节,你可以用
sizeof(void *)测试。指针其实也就是一个变量,这个变量里面存的都是4字节(32位)的整数。只是变量地址指向的内容各有差异吧了。
楼主的错误就是 楼上说的··


难道说
int a[10]={1},i=0;
void *p;
p=a;
for(i=0;i<10;i++)
cout<<*(p+i);

正确?

#18


引用 16 楼 anyidan 的回复:
引用楼主 mweibiao 的回复:
int a[10]={1};
char *p;
(int *)p=a;

这里如何错了?
VC 6.0 报错原因

D:\VC++ 6.0\VC2009\Common\test.cpp(13) : error C2106: '=' : left operand must be l-value


lz 直接将 p 声明为 int* 不就行……


我现在是不知道类型,要根据用户输入才能确定

#19


可以试下不定参数,本质是一个宏,要正确理解才能知道如何使用
代码像下面这样
void demo( int n, ... )
{
    va_list argp; /* 定义保存函数参数的结构 */
    int para; /* 存放取出的字符串参数 */
    /* argp指向传入的第一个可选参数,
    msg是最后一个确定的参数 */
    va_start(argp,n);
    while (n--)
    {
        para = va_arg(argp,char*);
        printf("%s\n",para);
    }
    va_end( argp ); /* 将argp置为NULL */
}

int main()
{
demo(4,"1","111","3.0","4");
    return 0;
}

#20


学习~~~

#21


c\c++交流群147325003

#22


引用 6 楼 agoago_2009 的回复:
引用 5 楼 flyrack 的回复:
int a[10]={1};
char *p;
p=(char *)a;
C里面指针类型不能变的

正解

++

楼主 error C2106: '=' : left operand must be l-value  这个错误明白不。 
先看看最基本的书。 赋值怎么赋值, 谁应该放在=号左边谁应该放在=右右边