c语言变量的地址
『壹』 关于c语言的 变量 地址 和 值
以下是个人理解:
变量具有类型,而类型是编译器用来分配存储空间的模板,比如int型分配4个字节,也就是分配了32位。所以,定义一个变量并不代表分配了一个空间,只是定义了一个分配模板。
只有使用了已经定义的变量,才为其分配空间,如int i=0;
分配空间给所定义的变量和使用变量,两个的本质是一样的,并且分配了空间就是使用变量来存储数值。而存储了值的那个变量的空间是内存里的存储单元,所以变量在内存中有一个地址,这个地址是随机的,也只有使用变量时候才分配的。
其实,直接访问变量就是直接访问一个地址,等价于访问一个指针,如果一个变量里存储的值是另一地址,那么就把这个变量当做指针!
本质上,指针和变量没有任何区别,他们的区别在于:为指针分配的地址空间是固定的,如32位机器就分配32位,64位机器就分配64位;而为变量分配的地址空间是因不同约定的类型的不同而不同的,这里说的是约定的类型,如int分配4个字节,long int分配8个字节,float分配4个字节。
(以上的一些变量类型所占的字节是因为编译平台和编译机器不同而会有所区别,但现在的机器和平台几乎都是如此的。)
『贰』 关于C语言字符变量的地址
因为你这个a是字符数组,a相对于指针,但是a不能赋新值,比如:
#include <stdio.h>
int main()
{
char a[100];
scanf("%c",a);
*a=65;//允许像指针一样操作
*(a+1)=0;
//a++; 但不可以和指针那样递增赋新值
printf(a);
return 0;
}
综上,a相对于指针,但不完全是指针,所以scanf中对于a是不必&求地址。
如果是:
char a;
scanf("%c",a);//则是错误的,因为这里的a是字符,则会把a的值当着scanf参数,而非a的地址。
『叁』 如何在c语言中定义一个变量在一个绝对地址
C中的“变量”用标识符表示,叫“变量名”;变量名的管理有一套对编程者透明的机制,所以不能将变量定义在一个程序员主观想像的地方。但指针变量例外,因为指针变量的值是地址值,所以可以将一个具体数值强制为同类型指针再赋给指针变量,如int *p=(int *)1234567;,这就把1234567这个地址值赋给指针变量p了——但这是很危险的操作,不仅不提倡,通常是禁止的,只是语法上合法。
『肆』 在c语言中给一个变量赋值与赋地址的区别
1、传递的变量值不同
两者其实传递的都是一个内存单元的内容。不同的是,值传递的内容是一个变量的值,得到这个值后,对这个值得修改不能改变原变量的值;而地址传递的是一个变量的地址,得到传递的地址值后,可以通过这个地址直接访问地址对应的那个变量,进而修改那个变量的值。
2、传递的途径不同
值传递只是将变量的内容复制一份而已,函数进行操作的其实是另一个变量,只是另一个变量的值和传递的变。赋地址相当于间接操作就相当于知道了这间房子的具体位置去找里面的主人而赋值是直接去根据主人名字去找它。
3、传递的函数不同
赋地址inta=10,b;给变量赋值就是b=a;但是赋地址就不行因为地址只能赋给指针变量应在上面基础上加char*p;把a的地址给p就是p=&a;地址只能存在指针变量中变量赋值,是可以给变量赋一个相同类型的任意的数据,而变量的地址是系统在内存随机分配的,不能更改。并且只有指针变量才能赋地址值。
给变量赋地址这个变量要为指针变量int*p,b;*p=&b;给变量赋值只要类型相同就行。其实都是一样,都是给一个数据,地址也是一个数值而已给变量赋值是复制一个数如:inta=1b;b=a;则变量b被赋值为a的值,但是赋地址得用指针,因为指针的定义就是地址的意思。