请真正了解c语言的人解释赋值的原理
答案:3 悬赏:50
解决时间 2021-03-26 13:40
- 提问者网友:谁的错
- 2021-03-25 22:15
请真正了解c语言的人解释赋值的原理
最佳答案
- 二级知识专家网友:未来江山和你
- 2021-03-25 23:37
对于int a=5;编译程序会将这个5当作整形常量保存下来,在程序运行时供你使用,举例来说,假设程序运行时常量区在80000000H处,变量区在80001000处,整形占用4个字节:
地址数据 说明
80000000H 05 00 00 00 常量5
80001000H xxxxxxxx变量a
80001004H xxxxxxxx变量num
80001008H xxxxxxxx变量ptr
a=5;语句相当于令CPU将存放常量5的地址(80000000H)处的数据4个字节复制到变量a的地址指向存储区赋值后80001000H处4个字节就变成了05H 00H 00H 00H
而ptr的定义是说ptr将存放一个地址,这个地址对应数据占用一个整形长度即4个字节;ptr=#的语句相当于两步,先求变量num的地址=8001004H,然后将这个地址放入ptr对应的存储区,执行后80001008H处4个字节变成了04H 10H 00H 08H
以上赋值语句类型分别是对应一致的。追答
追问:unsigned int a=5,b;
printf("&a=%x\n%&b=%x\n",&a,&b);
b=(unsigned int)&a; //书上说 & a 是指针 要强制转化 为何(但其实不强制转也可通过)
printf("(unsigned int )&b=%x\n",(unsigned int )&b);
追答:你要将a的地址数据赋值给unsigned int型的变量b,这两个类型不同当然要做转换,你如果不写,编译程序也要做的。
严格的书写是要强制转化的,否则编译会出警告甚至错误,这个书写习惯也在提醒你不会犯一些隐含的错误。
追问:a的地址难道不是unsigned int 吗?地址也是4个字节啊
追答:不一定,如果你在32位的操作系统中运行,这个地址确实是32位无符号整数,但你换用64位操作系统时,这个地址就是相当于unsigned long int型的了,另外即使是32位计算机、32位操作系统下,如果你的编译选项是小模式,这个地址有可能就是near型,是16位偏移量了。
具体地址的类型要由编译器在编译程序时取得当前操作系统地址位宽、当前程序编译内存模式等参数决定,你的程序不应当假设地址是某个固定的数据类型。
地址数据 说明
80000000H 05 00 00 00 常量5
80001000H xxxxxxxx变量a
80001004H xxxxxxxx变量num
80001008H xxxxxxxx变量ptr
a=5;语句相当于令CPU将存放常量5的地址(80000000H)处的数据4个字节复制到变量a的地址指向存储区赋值后80001000H处4个字节就变成了05H 00H 00H 00H
而ptr的定义是说ptr将存放一个地址,这个地址对应数据占用一个整形长度即4个字节;ptr=#的语句相当于两步,先求变量num的地址=8001004H,然后将这个地址放入ptr对应的存储区,执行后80001008H处4个字节变成了04H 10H 00H 08H
以上赋值语句类型分别是对应一致的。追答
追问:unsigned int a=5,b;
printf("&a=%x\n%&b=%x\n",&a,&b);
b=(unsigned int)&a; //书上说 & a 是指针 要强制转化 为何(但其实不强制转也可通过)
printf("(unsigned int )&b=%x\n",(unsigned int )&b);
追答:你要将a的地址数据赋值给unsigned int型的变量b,这两个类型不同当然要做转换,你如果不写,编译程序也要做的。
严格的书写是要强制转化的,否则编译会出警告甚至错误,这个书写习惯也在提醒你不会犯一些隐含的错误。
追问:a的地址难道不是unsigned int 吗?地址也是4个字节啊
追答:不一定,如果你在32位的操作系统中运行,这个地址确实是32位无符号整数,但你换用64位操作系统时,这个地址就是相当于unsigned long int型的了,另外即使是32位计算机、32位操作系统下,如果你的编译选项是小模式,这个地址有可能就是near型,是16位偏移量了。
具体地址的类型要由编译器在编译程序时取得当前操作系统地址位宽、当前程序编译内存模式等参数决定,你的程序不应当假设地址是某个固定的数据类型。
全部回答
- 1楼网友:山君与见山
- 2021-03-26 01:34
int * 是一个指针类型变量,它占用四个字节空间,存储的是一个地址,任何一个空间地址,都是由8位16进制数表示,&num表示的是地址,所以可以int* ptr = &num:
a是一个整形变量,是一个标示符,表示一个四字节空间,因为整形占用四个字节,而将5赋给a,只是将5存储在这个空间内,a是这个空间的名字,空间中存的值是5
a是一个整形变量,是一个标示符,表示一个四字节空间,因为整形占用四个字节,而将5赋给a,只是将5存储在这个空间内,a是这个空间的名字,空间中存的值是5
- 2楼网友:底特律间谍
- 2021-03-26 00:39
&叫做取地址, 那么&num肯定就是内存地址了,内存地址肯定是个整数啊
int *ptr = # 其中int*指针类型肯定也是地址啊,说白了也是整型,二者数据类型一致,可以赋值。
你上面int a = 5; 这句提到了5和a的类型不一致,这句话说错了,这类型是一致的。你的错误在于:你认为5是整型,a是字符型。 其实不是这样子的。
int a;表示定义一个变量,而这个变量是int类型的,就是说我现在在内存中开辟了一个4个字节的空间,用a来表示,这四个字节存储的内容为0101,就是5的二进制代码的补码,后面所有地方用a就可以表示5了。
这个a其实存储在内存中,内存也是分堆、栈等等,那么a会放在栈中,5会放在堆中,而栈中的a有一个链接,是直接链接到堆中的5的这块空间上的。链接的本质就是说,栈中的a存放了堆中的0101的首地址,读取的时候,会从首地址开始,依次读取4个字节即可。
明白了吗? a的类型是int型,a仅仅是个标识符,不是个对象,对象才是有类型的。(你可以这么理解,C语言中是没有对象的,但是可以理解为堆中的东西都是对象,栈中的都是标识符)。
int *ptr = # 其中int*指针类型肯定也是地址啊,说白了也是整型,二者数据类型一致,可以赋值。
你上面int a = 5; 这句提到了5和a的类型不一致,这句话说错了,这类型是一致的。你的错误在于:你认为5是整型,a是字符型。 其实不是这样子的。
int a;表示定义一个变量,而这个变量是int类型的,就是说我现在在内存中开辟了一个4个字节的空间,用a来表示,这四个字节存储的内容为0101,就是5的二进制代码的补码,后面所有地方用a就可以表示5了。
这个a其实存储在内存中,内存也是分堆、栈等等,那么a会放在栈中,5会放在堆中,而栈中的a有一个链接,是直接链接到堆中的5的这块空间上的。链接的本质就是说,栈中的a存放了堆中的0101的首地址,读取的时候,会从首地址开始,依次读取4个字节即可。
明白了吗? a的类型是int型,a仅仅是个标识符,不是个对象,对象才是有类型的。(你可以这么理解,C语言中是没有对象的,但是可以理解为堆中的东西都是对象,栈中的都是标识符)。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯