运算符&
之前我们在学输入的时候一定要有的一个符号就是&符号,那么这个运算符代表着什么呢?
scanf(“%d",&i); 里的&叫做取地址运算符
它的作用是获得变量的地址,它的操作数必须是变量.(注意因为C语言的每一个变量是放在内存里的,它放在内存中所以就会有地址来告诉你他的位置。)
那么我们想将我们定义的变量的地址打印出来应该怎么做呢?
#include <stdio.h>
int main( )
{
int a ;
printf("%p\n", &a);
return 0;
}
运行结果:
我们可以看到这里的地址是以16进制的形式输出的。
注意:
当我们想打印变量的地址的时候应该使用%p来进行打印
地址和我们的整数并不是相同的
地址的大小是否与int相同取决于编译器
&不能取的地址
这里我们要注意取地址符&只能对变量取地址,它不能对没有地址的东西取地址比如:
#include <stdio.h>
int main( )
{
int a;
printf("%p\n", &(a++));
printf("%p\n", &(++a));
return 0;
}
编译后的报错信息:
在这里它告诉我们左值需要作为一元’&'操作数。
相邻变量的地址
#include <stdio.h>
int main( )
{
int a=0,b;
printf("%p\n", &a);
printf("%p\n", &b);
return 0;
}
运行结果:
在这里我们可以看到这两个相邻变量地址的差是4,这是因为我们的int类型的长度就是4。
注意: 在我们的程序中a变量的地址是000000000062FE1C而b变量的地址却是000000000062FE18,这是因为C语言的内存模型是将这两个变量以堆栈的形式来分配内存而堆栈分配内存是自上而下来分配的。
数组变量的地址
#include <stdio.h>
int main( )
{
int a[10] ;
printf("%p\n", &a);
printf("%p\n", a);
printf("%p\n", &a[0]);
printf("%p\n", &a[1]);
return 0;
}
运行结果:
在这里我们会发现&a的地址=a的地址=a[0]的地址而后a[1]的地址是a[0]的地址加4,这是因为我们可以将数组的地址理解为数组元素的首地址而后面的地址是在首地址的基础上向后分配内存的。
|