① c语言常量区的地址赋值
这个情况比较多,不过一般说以下两种情况下的常量是有地址的:
1、如果是以const关键字修饰变量而产生的“不可变变量”的话,是有地址的,如const int a = 0。
但是严格来说const修饰只是产生了不可变变量,并不是严格意义上的常量。
2、字符串常量,例如 char *a = "abc";那么字符串“abc”就是一个字面值字符串,这是一个常量,其地址就是这个字符串第一个字符所在的地址。
再有像是字面值数字 "int a = 5"里边的5,是没有地址的。
表达式本身作为代码,并不拥有地址。但是用来组成表达式的变量或常量是可以拥有地址的。
获取一个常量或变量的地址可以用“&”取址符,例如:
const int b = 0;
const int * pb = &b;
那么pb里边就是b的地址了。
② C语言 将地址赋值给指针变量
取决于p的类型。
struct stu_type *p=&stu1;
这里的*是和类型一起的,用来定义,而非初始化。 等效于
struct stu_type *p;
p=&stu1;
至于去掉, 如果写成struct stu_type p=&stu1;绝对会报错。 不存在你说的去掉和加上结果不变。
③ 关于C语言中给绝对地址的赋值问题
您说的应该是对的,用VC的话前面那条语句是编译不通过的。
补充啊,谈点个人看法:
虽然在VC上面编译不能通过(unsigned int *)0x100000 = 0x3322语句,但是个人认为这条语句与*((unsigned int *)0x100000) = 0x3322所表达的含义是不同的。前者是对指针赋值,后者是对指针所指向的对象赋值。
1. 从变量的定义出发,变量是地址空间的别名,也即例如unsigned int *a表示给一个存储空间命名为a同时这个空间是一个地址指针,假设这个存储空间的地址为0x100000,那么此时a即是地址0x100000单元的别名,对a赋值即是对0x100000所标识的空间赋值。因此(unsigned int *)0x100000 = 0x3322赋值的空间是0x100000。
2. 对于*((unsigned int *)0x100000) = 0x3322语句,也即相当于*a = 0x3322,也即是a所指向的空间被赋值。也即是先取出0x100000地址空间的值作为地址找到对应的存储空间然后存储0x3322。
个人的一点浅见,不知道是否符合真实情况。
④ 在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的值,但是赋地址得用指针,因为指针的定义就是地址的意思。
⑤ C语言 地址赋值问题
汇编语言就可以这样,但是C不是汇编,需要类型转换,下面的程序调试通过,结果正确,但是有一个警告:
main(){
int a = 10, b;
unsigned int addr = &a;
b = *((int *)addr);
printf("%d\n",b);
}
⑥ keil51中如何用C语言定义寄存器的地址并给地址赋值
KeilC51中定义寄存器变量的方法如下:
1、特殊功能寄存器的定义:
sfr和sfr16,比如:
sfr P1=0x90;
sfr16 T2=0xcc;
2、普通寄存器变量定义:
使用DBYTE和XBYTE来实现,比如
unsigned char temp=XBYTE[0x1000];//这是访问外部地址的语句,也可以是外部IO口地址
unsigned char temp=DBYTE[0x40];//这是将内部寄存器40H定义为变量temp
⑦ C语言 多级指针 指针变量赋地址值的方式
**p就是一个双重指针啊,意思就是说这个指针变量里面放的是一个指针的地址(一般的指针变量里面放的是一个变量的地址),这么说不知道你明不明白。
通过指针变量获得地址值:
int
**p;//双重指针
int
*q;//普通指针
p=&q;//将指针q的地址赋值给p
通过标准函数获得地址值:
int
**p;
p=(int*)malloc(n*sizeof(int*));//动态创建n个int类型的指针变量空间
其实说白了双重指针就是二维数组的头指针,数组的每一行的开头就是那一行所代表的一维数组的指针,二维数组头指针就是每一行的头指针的地址数组。
哇
我自己都觉得指针这个东西好绕。。。。不过多用就明白了。
⑧ 地址可以赋值给地址吗C语言
可以的
指针类型 就是做这个的
而且 不管是什么样的地址 在C语言中 都是一个整型值
所以 地址赋值给整型变量都是可以的。